我需要访问 joomla 用户表jos_users
以从外部 php 脚本 [codeignitor] 进行登录检查。
joomla 像这样存储密码
4e9e4bcc5752d6f939aedb42408fd3aa:0vURRbyY8Ea0tlvnTFn7xcKpjTFyn0YT
看起来这不是正常的 MD5,所以我不能使用md5(password)
。
创建密码的可能方法是什么?
谢谢你。
我需要访问 joomla 用户表jos_users
以从外部 php 脚本 [codeignitor] 进行登录检查。
joomla 像这样存储密码
4e9e4bcc5752d6f939aedb42408fd3aa:0vURRbyY8Ea0tlvnTFn7xcKpjTFyn0YT
看起来这不是正常的 MD5,所以我不能使用md5(password)
。
创建密码的可能方法是什么?
谢谢你。
Joomla 密码是 MD5 散列的,但密码在散列之前是加盐的。它们存储在数据库中,因为{hash}:{salt}
该盐是长度为 32 个字符的随机字符串。
所以要创建一个新的密码哈希,你会做md5($password.$salt)
编辑
好的,所以对于检查密码,假设用户myguy
输入密码mypassword
,您将从数据库中检索具有 username 的行myguy
。
在这一行中,您会找到一个密码 say 4e9e4bcc5752d6f939aedb42408fd3aa:0vURRbyY8Ea0tlvnTFn7xcKpjTFyn0YT
。您将密码哈希和盐分开:
$hashparts = preg_split (':' , $dbpassword);
echo $hashparts[0]; //this is the hash 4e9e4bcc5752d6f939aedb42408fd3aa
echo $hashparts[1]; //this is the salt 0vURRbyY8Ea0tlvnTFn7xcKpjTFyn0YT
现在使用这个盐和myguy
输入的密码计算哈希
$userhash = md5($userpassword.$hashparts[1]); // This would be 'mypassword' and the salt used in the original hash
现在,如果这$userhash
和$hashparts[0]
相同,则用户输入了正确的密码。
从 joomla 论坛,这就是背后发生的事情:
A. Generate a password
B. Generate a string with 32 random characters
C. Concatenate Password (Step A) and RandomString (Step B)
D. Take md5(Result of Step C)
E. store Step D Result : Step B Result
例子:
Generate a password - Let 'testing'
Generate a string of 32 random characters - 'aNs1L5PajsIscupUskaNdPenustelsPe'
Concatenate Password and random string - testingaNs1L5PajsIscupUskaNdPenustelsPe
md5(Step C Result) - 5cf56p85sf15lpyf30c3fd19819p58ly
store step d:step B - 5cf56p85sf15lpyf30c3fd19819p58ly:aNs1L5PajsIscupUskaNdPenustelsPe
您可以在 Joomla 中找到代码,例如
$salt = JUserHelper::genRandomPassword(32);
$crypt = JUserHelper::getCryptedPassword("testing", $salt);
$password = $crypt . ':' . $salt;
或者我们可以说
password DB field = md5(password + salt) + ":" + salt
其中 salt 是随机的 32 字符字符串。
谢谢
在 joomla 标准中,您可以使用以下方式创建密码
jimport('joomla.user.helper');
$salt = JUserHelper::genRandomPassword(32);
$crypt = JUserHelper::getCryptedPassword($password_choose, $salt);
$password = $crypt.':'.$salt;
您提到您正在从外部文件(或程序)访问,那么如果您在另一侧安装了 joomla,您可以从 joomla 结构外部访问它。
像这样使用joomla默认框架
define( '_JEXEC', 1 );
define('JPATH_BASE', dirname(__FILE__) );//this is when we are in the root
define( 'DS', DIRECTORY_SEPARATOR );
require_once ( JPATH_BASE .DS.'includes'.DS.'defines.php' );
require_once ( JPATH_BASE .DS.'includes'.DS.'framework.php' );
$mainframe =& JFactory::getApplication('site');
$mainframe->initialise();
我无法使用preg_split
,但explode
效果很好。
$hashparts = explode (':' , $dbpassword);
从 joomla 源文件 library/joomla/crypt/password/simple.php 有多种存储方式,有些没有“:”字符。
switch ($type)
{
case '$2a$':
case JCryptPassword::BLOWFISH:
if (JCrypt::hasStrongPasswordSupport())
{
$type = '$2y$';
}
else
{
$type = '$2a$';
}
$salt = $type . str_pad($this->cost, 2, '0', STR_PAD_LEFT) . '$' . $this->getSalt(22);
return crypt($password, $salt);
case JCryptPassword::MD5:
$salt = $this->getSalt(12);
$salt = '$1$' . $salt;
return crypt($password, $salt);
case JCryptPassword::JOOMLA:
$salt = $this->getSalt(32);
return md5($password . $salt) . ':' . $salt;
}
}
Joomla!使用PhPass。
root/libraries/phpass/PasswordHash.php
看看这里。您将在此处看到密码是如何生成的。
$2y是bcrypt hashes的默认(和首选)前缀。至于代码,您需要查看内部JUserHelper's
hashPassword
和verifyPassword
方法,以了解 Joomla 现在是如何处理事物的。
https://github.com/joomla/joomla-cms/blob/3.4.1/libraries/joomla/user/helper.php#L296-L387
https://docs.joomla.org/API15:JUserHelper/getCryptedPassword
https://docs.joomla.org/API15:JUserHelper/getSalt
检查链接,希望对您有所帮助:)
Joomla 使用“普通”md5“理解”密码。
我过去所做的(测试用户的登录)是保存原始密码,在 md5 中加密一个新密码,在数据库中替换它,用浏览器测试它(它可以工作),当我是完成,将原始密码粘贴到数据库中。
<?php
$r = bin2hex(mcrypt_create_iv(16, MCRYPT_DEV_URANDOM));
$p = 'the_password';
$s = $p . $r;
$m = md5($s);
$out = $m . ':' . $r;
echo $out;
Len 16 因为 bin2hex 将字符大小加倍,因为 1 字节变为 2 字节
如果你只使用 md5($password); 它会工作,试试吧。Joomla 有一种机制,它可以使用多种类型的密码(包括最近的强密码)。您不必担心冒号后面的部分。只需使用 md5($password) 就可以了。
顺便说一句,这也适用于 Joomla 3.x。