1

更新:

回复发现于:

http://community.invisionpower.com/tracker/issue-21634-md5-once-password-does-not-decode-html-entities/


我想使用我的论坛凭据(我正在使用 Invision Power Board)制作一个单独的页面,所以我开始研究密码的工作原理。

主要在 members 表上,您有 members_pass_hash 和 members_pass_salt 表,加密完成如下:

/**
 * Generates a compiled passhash.
 * Returns a new MD5 hash of the supplied salt and MD5 hash of the password
 *
 * @param   string      User's salt (5 random chars)
 * @param   string      User's MD5 hash of their password
 * @return  string      MD5 hash of compiled salted password
 */
static public function generateCompiledPasshash( $salt, $md5_once_password )
{
    return md5( md5( $salt ) . $md5_once_password );
}

之后我开始做我的页面,但无论我做什么,密码都不会与数据库中的密码匹配。

即使MD5(CONCAT(MD5(members_pass_salt),MD5('mypass'))在 mysql 上直接使用也不能给我正确的值......

我也在社区和 ipb 的论坛上进行了搜索,但无法缩小这里可能出现的问题。

我产生密码的代码如下:

$password = $this->input->post('password');
$md5_once_password = md5($password);
$password_hash = md5( md5( $salt ) . $md5_once_password );

$salt 来自数据库,我已将其回显到我的页面以确保它也是正确的盐。

继续 IPB 代码还有:

if ( $member['members_pass_hash'] == self::generateCompiledPasshash( $member['members_pass_salt'], $md5_once_password ) )
{
    return true;
}
else
{
    return false;
}

回到我从 IPB 发布的初始代码,这意味着密码与members_pass_hash成员表中的字段匹配md5( md5( $salt ) . $md5_once_password )

关于我可能做错什么以使密码不匹配的任何想法?

在某处或任何地方编码?

使用哈希进行更新以进行测试:

这个工作正常:

salt: Do.|O
password: fsk23478cf
hash: f3f3c75110ea9a27a1c01e580676997f

这个不工作,还不知道为什么:

salt: ppxps
password: fsk23478cf!*
hash saved by the forum: d060c2fb78c5b8a9e9d303c7b4fab456
hash created by my aap: 0df0c7f24f7f79bd7ad8e501f5447986

更新2:

解决exclamation mark了密码问题,但仍然不知道是什么原因造成的以及如何解决。

密码!将无法正确匹配,现在我正在尝试找出论坛是否对!我没有找到的任何特殊内容进行了处理,我发现它确实修剪到密码字段,然后如上所述 md5 它.

4

3 回答 3

1

你应该知道,如果你给它任何值md5()总是输出相同的值

话虽如此,假设您使用两种算法检查相同的密码,在这两种情况下您的盐似乎并不相同。它可能是一个炭,可能是一些看不见的炭,也可能是盐的不同来源,但似乎第一种情况的盐不是第二种情况的盐。

只需确保您在讨论板上有帐户并检查正在检查的密码(也许在调用函数/方法时将其保存到文件中?)并与您传递给新创建的函数的内容进行比较。

md5()这不是魔术,如果您将相同的值传递给它,也不应该有不同的行为 - 这是散列函数的基本基础。问题在于您传递给md5().

于 2011-11-09T12:24:52.993 回答
0

多头和空头:

在为 md5 散列准备纯文本 IPB 密码时,首先通过 htmlentities() 运行它。

于 2012-08-02T21:02:01.060 回答
0

尝试修剪你的通行证,bcs 当你最后有一个 \n 或任何其他类型的 LF 时,哈希将从字符串 + lf 中计算出来。我希望这可以帮到你。

于 2011-11-09T12:18:16.257 回答