joomla密码encryption
我需要访问joomla用户表jos_users
从外部php脚本[codeignitor]进行login检查。
joomla存储这样的密码
4e9e4bcc5752d6f939aedb42408fd3aa:0vURRbyY8Ea0tlvnTFn7xcKpjTFyn0YT
看起来这不是正常的MD5,所以我不能使用md5(password)
。
什么是可能的方式来创build密码?
谢谢。
Joomla密码是MD5哈希值,但密码在被哈希之前被腌制。 它们以{hash}:{salt}
存储在数据库中{hash}:{salt}
这个salt是一个32个字符的随机string。
所以要创build一个新的密码哈希,你会做md5($password.$salt)
编辑
好吧,为了检查密码,假设用户myguy
input了密码mypassword
,您将从数据库中检索具有用户名myguy
。
在这一行中,你会发现一个密码说4e9e4bcc5752d6f939aedb42408fd3aa:0vURRbyY8Ea0tlvnTFn7xcKpjTFyn0YT
。 你分开密码哈希和盐:
$hashparts = preg_split (':' , $dbpassword); echo $hashparts[0]; //this is the hash 4e9e4bcc5752d6f939aedb42408fd3aa echo $hashparts[1]; //this is the salt 0vURRbyY8Ea0tlvnTFn7xcKpjTFyn0YT
现在使用这个salt和input的密码来计算哈希值
$userhash = md5($userpassword.$hashparts[1]); // This would be 'mypassword' and the salt used in the original hash
现在,如果$userhash
和$hashparts[0]
是相同的,那么用户input了正确的密码。
从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中find代码
$salt = JUserHelper::genRandomPassword(32); $crypt = JUserHelper::getCryptedPassword("testing", $salt); $password = $crypt . ':' . $salt;
或者我们可以说
password DB field = md5(password + salt) + ":" + salt
凡是盐是随机的32个string。
谢谢
在joomla标准中,您可以使用以下方式创build密码
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源文件库/ 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散列的默认(和首选)前缀。 至于代码,您将需要查看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。
我过去所做的(testing用户的login名)是保存原始密码,在md5中encryption一个新的密码,将其replace到数据库中,用浏览器进行testing(并且工作),以及当我完成后,将原始密码粘贴到数据库中。
如果你只是使用MD5($密码); 它会工作,尝试一下。 Joomla有一个机制,它可以使用多种types的密码(包括最近的强密码)。 你不必担心冒号后的部分。 只需使用md5($密码),它一定会工作。
顺便说一句,这也将在Joomla 3.x上工作。
<?php $r = bin2hex(mcrypt_create_iv(16, MCRYPT_DEV_URANDOM)); $p = 'the_password'; $s = $p . $r; $m = md5($s); $out = $m . ':' . $r; echo $out;
因为bin2hex是字符大小的两倍,因为1字节变成了2字节