11

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

  • $P$Do8QrURFT1r0NlWf0X/grdF/aMqwqK/

  • $P$DH38Lch9z508gJiop3A6u0whTity390

  • ...........

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

  • 1802ebc64051d5b4f4d1b408babb5020:0PHJDbnsyX05YpKbAuLYnw2VCzFMW2VK

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

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

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

但是如果没有双结我不能这样做(:)

4

3 回答 3

15

试试这个,

以下代码正在创建 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,请确保您的服务器 PHP 版本能够支持此功能,请在此处阅读更多信息

其他版本的 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
   }

希望能帮助到你..

于 2014-01-23T09:38:56.673 回答
10

Joomla 的默认用户类不再使用加盐 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 可能已经覆盖了默认加密。

于 2014-01-23T17:43:20.117 回答
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。

于 2014-04-10T11:18:43.717 回答