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)

编辑

好吧,为了检查密码,假设用户myguyinput了密码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_splitexplode效果很好。

 $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 

看看这里。 你会在这里看到密码是如何产生的。

$ 2ybcrypt散列的默认(和首选)前缀。 至于代码,您将需要查看JUserHelper's hashPasswordverifyPassword方法,以了解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字节