joomla密码加密

Posted

技术标签:

【中文标题】joomla密码加密【英文标题】:joomla password encryption 【发布时间】:2012-05-12 18:37:30 【问题描述】:

我需要访问 joomla 用户表 jos_users 以从外部 php 脚本 [codeignitor] 进行登录检查。

joomla 这样存储密码

4e9e4bcc5752d6f939aedb42408fd3aa:0vURRbyY8Ea0tlvnTFn7xcKpjTFyn0YT

看起来这不是正常的 MD5,所以我不能使用md5(password)

创建密码的可能方法是什么?

谢谢。

【问题讨论】:

深问题 :) 如果您仍然认为 md5 是存储密码的正常方式,您可能需要对此进行更多研究 仅供参考,MD5 绝不能用于散列密码。曾经。尤其是在你的例子中没有盐。 感谢您的信息;但是这里我不打算生成密码字段。 你为什么不解释一下你到底想要做什么。您的目的是从外部脚本重置或创建密码吗?起初听起来就是这样,但现在听起来你想要一些不同的东西。您正在尝试登录吗? 【参考方案1】:

Joomla 密码是 MD5 散列的,但密码在散列之前是加盐的。 它们在数据库中存储为hash:salt,这个盐是一个长度为 32 个字符的随机字符串。

所以要创建一个新的密码哈希,你可以使用md5($password.$salt)

编辑

好的,所以检查密码,假设用户 myguy 输入密码 mypassword,您将从数据库中检索用户名 myguy 的行。

在这一行中,您会找到密码4e9e4bcc5752d6f939aedb42408fd3aa:0vURRbyY8Ea0tlvnTFn7xcKpjTFyn0YT。 您将密码哈希和盐分开:

$hashparts = preg_split (':' , $dbpassword);
echo $hashparts[0]; //this is the hash  4e9e4bcc5752d6f939aedb42408fd3aa
echo $hashparts[1]; //this is the salt  0vURRbyY8Ea0tlvnTFn7xcKpjTFyn0YT

现在使用此盐和输入的密码 myguy 计算哈希

$userhash = md5($userpassword.$hashparts[1]); // This would be 'mypassword' and the salt used in the original hash

现在如果$userhash$hashparts[0] 相同,则用户输入了正确的密码。

【讨论】:

对于现有密码,只需在: 后面输入字符串,即盐。要创建新密码 salt 只需生成一个随机字符串。作为尔。 Anurag Jain 在他的回答中说,您可以使用 JUserHelper::genRandomPassword(32) 轻松做到这一点 对不起,但我仍然找不到问题的答案,假设用户有通过hello,但我怎么知道那个随机数?它由 JOOMLA 生成并存储在数据库中 .. @DileepDil 查看我的编辑以了解如何检查密码。 你在这个例子中使用了真实数据吗?我得到了 md5(mypassword0vURRbyY8Ea0tlvnTFn7xcKpjTFyn0YT) == 0ac1a27af8bc4f99edd278dde1fbd18b @noisy 我没有使用真实数据。哈希和盐来自问题,我只是编了密码,它们不匹配。【参考方案2】:

来自 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 中找到类似的代码

$salt = JUserHelper::genRandomPassword(32);
$crypt = JUserHelper::getCryptedPassword("testing", $salt);
$password = $crypt . ':' . $salt;

或者我们可以说

password DB field = md5(password + salt) + ":" + salt 

其中 salt 是随机的 32 字符字符串。

谢谢

【讨论】:

我不打算注册新用户,我需要在密码字段中获取当前字符串。这样我就可以匹配打扰用户给定的密码和密码字段上的密码。 md5 是一种单向哈希,这意味着您只能对其进行加密,但不能反向解密,无法进行解密您可以先从数据库密码中获取 32 个汽车随机字符串,并借助该安全密钥从输入密码创建 joomla 类型密码并匹配两者... 如何从密码中获取随机字符串?怎么可能? hi joomla db 密码格式是 md5(password + salt) : salt 其中 salt 是密钥,因此您可以使用 : 关键字从给定密码中分解密钥...然后将其与你的密码生成 joomla 类型密码,然后匹配两个密码(由你自己和 db 密码生成)......谢谢 同样的问题,你。你在这个例子中使用了真实数据吗?我得到了 md5(testingaNs1L5PajsIscupUskaNdPenustelsPe) == 6e05e46fcc516a612a4afa9b9b7827c7【参考方案3】:

在 joomla 标准中,您可以使用以下方式创建密码

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

【讨论】:

***.com/questions/10409432/… - 这个问题仍然没有答案:)【参考方案4】:

我无法使用preg_split,但explode 效果很好。

$hashparts = explode (':' , $dbpassword);

【讨论】:

【参考方案5】:

从 joomla 源文件 library/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;


    

【讨论】:

【参考方案6】:

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 v3.2.2 切换到 phpass【参考方案7】:

Joomla 使用“普通”md5“理解”密码。

我过去所做的(测试用户的登录)是保存原始密码,在 md5 中加密一个新密码,在数据库中替换它,用浏览器测试它(它可以工作)和完成后,将原始密码粘贴到数据库中。

【讨论】:

对不起 jackJoe 但是 joomla 密码不是普通的 md5 哈希。它是 md5 哈希和 joomla 密钥的组合。 @ShaikhFarooque 我知道,我是在建议如何使用普通 md5 测试密码。 不再使用,从版本 3 开始,它不再使用 MD5。【参考方案8】:
<?php
$r = bin2hex(mcrypt_create_iv(16, MCRYPT_DEV_URANDOM));
$p = 'the_password';

$s = $p . $r;
$m = md5($s);

$out = $m . ':' . $r;
echo $out;

Len 16,因为 bin2hex 将字符大小加倍,因为 1 字节变为 2 字节

【讨论】:

【参考方案9】:

如果你只使用 md5($password);它会工作,试试吧。 Joomla 有一种机制,它可以处理多种类型的密码(包括最近的强密码)。您不必担心冒号后面的部分。只需使用 md5($password) 就可以了。

顺便说一句,这也适用于 Joomla 3.x。

【讨论】:

以上是关于joomla密码加密的主要内容,如果未能解决你的问题,请参考以下文章

使用 php 创建 joomla 用户密码?

密码学中的对称加密和非对称加密

分组密码加密模式选择都有哪些?

PHP如何对用户密码进行加密

asp使用MD5加密的密码登录怎么解决?

登录怎么对密码MD5加密