Joomla加密方式密码验证详解

以下内容都假设 用户输入的密码 为 $password, 数据库中查出来的用户密码为 $row['password']

1.密码长度为65位的中间存在“:”的 一般都是md5的加密,验证方式

list($hash, $salt) = explode(':', $row['password']);

if(md5($password.$salt) == $hash){

//密码正确

}


2.如果密码长60位 前面是“$2y$”类似这种字符开头的话 使用的是 crypt() 的加密方式, 在php5.5以上的版本中, 系统带的 password_hash($password, $salt); 来加密的,这个密码验证只能通过 password_verify() 函数来验证,这个 验证代码为

if(password_verify($password, $row['password'])){

//密码正确

}

在有的版本中我们发现还有一种密码长度为40位 以 类似“$P$D”这种密码开头,

这个密码也是和 上面的 crypt 加密有关系,这个密码如何验证 使用代码未能实现,但可以使用Joomla自带的函数来实现验证。代码如下

$is_pwd_right = JUserHelper::verifyPassword($password, $row['password'], $row['id']);

其中 $row['id'] 为用户的ID

如果返回值为真则验证成功,如果返回值为false 或0 验证失败,也就是密码错误。这个方式同样适用于长度为60的那个验证。

目前就本人了解的这几个版本的joomla,1.x, 2.x 3.0,3.1, 3.2 可以整合上面的几个方面做验证。

比如,安装的joomla3.2加密方式就是长度为60的可以使用password_verify()验证的。

joomla 3.0, 和 joomla 3.1, joomla 3.1.5 则是使用的 MD5加密的长度为65的密码

曾在一个客户的网站上发现使用 $match = JUserHelper::verifyPassword($password, $row['password'], $row['id']); 来验证用户密码的,版本就不清楚了。

转自http://blog.windigniter.com/2013/12/joomla-encryption-password-authentication/

 

另外Po下Joomla验证登陆帐密的代码位置:

登陆验证位置:..\plugins\authentication\joomla\joomla.php    line32  onUserAuthenticate方法

验证密码位置:..\libraries\joomla\user\helper.php       line328  verifyPassword方法