【问题标题】:Joomla 3.2.1 password encryptionJoomla 3.2.1 密码加密
【发布时间】:2014-02-13 18:10:02
【问题描述】:

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

  • $P$Do8QrURFT1r0NlWf0X/grdF/aMqwqK/

  • $P$DH38Lch9z508gJiop3A6u0whTity390

  • ........

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

  • 1802ebc64051d5b4f4d1b408babb5020:0PHJDbnsyX05YpKbAuLYnw2VCzFMW2VK

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

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

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

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

【问题讨论】:

  • 我希望希望他们还没有使用 MD5,它真的很弱。
  • 那不是md5,是salted md5,虽然不如现在用的那么好,但差别很大。
  • 是的,但这是最后一个可用的 joomla 版本...

标签: php joomla password-hash


【解决方案1】:

试试这个,

以下代码创建 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 版本支持此功能,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
   }

希望对你有帮助..

【讨论】:

  • 嗨。使用这个尝试“测试”作为密码,我得到一个 65 个字符的字符串:$P$D6qfmWHlMjUFNUxiYnt5qawXZ1bOTP。但是更改用户的密码以在 BD 中测试我得到一个 34 个字符的字符串:$P$D6qfmWHlMjUFNUxiYnt5qawXZ1bOTP。为什么?
  • @OceanicSix 如何从管理员端更改密码?它使用默认的 joomla 脚本或您自己的自定义代码。它总是创建长度为 65char 的密码。
  • 我的意思是,使用 Jobin 在他的第一部分代码中所说的话,我得到了一个 65 个字符的密码。将其密码更改为用户(在后端/管理员视图中),然后在数据库中检查已存储的内容,该字符串有 34 个字符。这就是 joomla 存储密码的方式。我终于用 David Fritsch 代码做了一个 34 个字符的加密密码。
  • 两者都工作正常吗?这也取决于版本。
  • 最新版本的 Joomla 在可用时使用内置的 PHP password_hash 函数 (PHP >= 5.5)。该散列函数使用“标准”bcrypt 算法,该算法可用于多种语言。
【解决方案2】:

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

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

【讨论】:

  • 对于未来的访问者 - 此代码将“测试”散列到:$P$DCeSr0.vZrpBk6GK.q8​​VrltNIdwetN0
【解决方案3】:

通过 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。

【讨论】:

  • 对于未来的访问者 - 此代码输出 (Joomla 3.4.4):密码:$2y$10$upX58HulZWgBwKps2DaB9eoi2jI90H3i.JP3aSJQ.QwJWDo62l/Cy
  • 对于未来的访问者,我发现实际上(使用 Joomla!3.5.1)哈希总是不同的,即使插入了相同的密码。
猜你喜欢
  • 2012-05-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多