Joomla 3.2.1密码加密

时间:2014-01-23 09:24:17

标签: php joomla password-hash

当用户在网站上注册时,我在密码表中查看数据库joomla_users,密码以下列格式存储:

  • $ P $ Do8QrURFT1r0NlWf0X / GRDF / aMqwqK /

  • $ P $ DH38Lch9z508gJiop3A6u0whTity390

  • ........

但不是文档中描述的形式(MD5 +“:”+ SALT):

  • 1802ebc64051d5b4f4d1b408babb5020:0PHJDbnsyX05YpKbAuLYnw2VCzFMW2VK <​​/ LI>

我需要为我澄清这一点,因为我正在使用外部脚本检查用户凭据以检查密码匹配。

在我的PHP脚本中,我有代码将SALT与数据库中的密码分开:

$parts   = explode( ':', $password_database );
$crypt   = $parts[0];
$salt   = $parts[1];

但如果没有dobule结(:)

,我就不能这样做

3 个答案:

答案 0 :(得分:14)

试试这个,

以下代码创建了Joomla标准密码(旧版本1.5,1.7等)

 jimport('joomla.user.helper');
 $salt = JUserHelper::genRandomPassword(32);
 $crypt = JUserHelper::getCryptedPassword($password_choose, $salt);
 $password = $crypt.':'.$salt;

Joomla 3.2 + 引入了PHP的密码算法 bcrypt ,但它需要最低PHP 5.3 + 如果您打算使用 bcrypt < / strong>确保您的服务器PHP版本具有此功能,read more here

Joomla的另一个版本使用以下方法( Joomla 3.x

 jimport('joomla.user.helper');
 $yourpass = JUserHelper::hashPassword($password_choose);

旧算法在最新版本中也可以正常工作,唯一不同的是旧版本创建65个字符的密码而新的创建34个字符串。始终使用更新版本

另外如果你使用外部脚本应该包括如下的Joomla框架。这应该在你的外部php文件的顶部

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();

你还提到你必须检查用户凭证,然后不需要检查密码格式,所有的东西只是在框架加载后使用下面的代码。

   $credentials['username'] = $data['username']; //user entered name
   $credentials['password'] = $data['password']; //users entered password
   $app = JFactory::getApplication();
   $error = $app->login($credentials, $options);
   if (!JError::isError($error)) {
    // login success
    }
  else{
    //Failed attempt
   }
希望它有所帮助..

答案 1 :(得分:10)

Joomla的默认用户类不再使用salted MD5来散列密码。 JUser类的绑定功能现在调用JUserHelper::hashPassword($array['password'])来加密密码。

目前这个功能是这样的:

public static function hashPassword($password)
    {
            // Use PHPass's portable hashes with a cost of 10.
            $phpass = new PasswordHash(10, true);

            return $phpass->HashPassword($password);
    }

这意味着它现在依赖于PHPass,你可以在这里阅读更多信息:http://www.openwall.com/phpass/。基于阅读本网站的介绍,我猜测加密现在是bcrypt而不是MD5,但Joomla可能已经覆盖了默认加密。

答案 2 :(得分:5)

在David Fritsch的回答下,我可以像Joomla那样使用加密密码:

<?php
    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();

    jimport('joomla.user.helper');
    $password = "test";     
    echo "<strong>Password: </strong>" . JUserHelper::hashPassword($password);
?>

请注意,您必须将文件存储在joomla根目录中,或更改JPATH_BASE。