2

在crackstation.net 上说:

验证密码

  • 从数据库中检索用户的盐和哈希。
  • 将盐添加到给定密码并使用相同的散列函数对其进行散列。
  • 将给定密码的哈希值与数据库中的哈希值进行比较。如果它们匹配,则密码正确。否则,
    密码不正确。

但是在页面底部列出的源代码中,我无法弄清楚该validate_password函数如何考虑盐。我的意思是给定密码前面的盐在哪里?

这是有问题的功能:

function validate_password($password, $correct_hash)
{
    $params = explode(":", $correct_hash);
    if(count($params) < HASH_SECTIONS)
       return false;
    $pbkdf2 = base64_decode($params[HASH_PBKDF2_INDEX]);
    return slow_equals(
        $pbkdf2,
        pbkdf2(
            $params[HASH_ALGORITHM_INDEX],
            $password,
            $params[HASH_SALT_INDEX],
            (int)$params[HASH_ITERATION_INDEX],
            strlen($pbkdf2),
            true
        )
    );
}
4

3 回答 3

3

看起来 Salt、Hash 和 interation number 存储在同一个字符串中,并在函数开头分为三个字符串(在一个数组中):

$params = explode(":", $correct_hash);

值的顺序取决于常量 HASH_ALGORITHM_INDEX、HASH_SALT_INDEX 和 HASH_ITERATION_INDEX 的定义方式。

于 2013-08-26T21:28:38.300 回答
1
于 2013-08-27T06:59:24.023 回答
-4

我不完全确定上面发生了什么,所以让我稍微解释一下哈希,这已经完成了,并且有来源,但无论如何我都会去!这对我们所有人来说都是新的!

如果我们有一个函数,调用它f并让它成为我们的哈希函数,它将每个可能的输入都带到有限数量的输出中,这就是它不能反转的原因,这被称为满射函数http://en .wikipedia.org/wiki/Surjection更多信息请参见此处。就像f(x)=x^2我们f(x)=4实际上不知道 x 是什么(我们碰巧知道它可以是 2 或 -2)

但是哈希的顺序不同,因为无限数量的(理论上,计算机无法处理所有字符串中最长的一个,它太大了!)输入到有限数量的输出。

如果我知道这是一个密码假设,假设您的密码是PI know f(P)=h,并且 P 是 10,000 个值中的 1 个,包括 0000 到 9999。所以我可以做 10k 哈希(最坏的情况)并得到你的密码。

盐是确定性地应用于输入的一些随机垃圾,所以假设s(x)盐x,它可以通过在输入的每个字母之间放置字母“k”(虽然这将是一个垃圾盐)但是这样的输出s只有取决于x,给定相同的输入,我们得到相同的输出。

然后你做得到f(s(x))你的哈希,这样如果我知道哈希,但不知道盐,我必须先弄清楚你是如何加盐的,如果我知道盐,我必须知道如何你应用了它,等等。

所以假设你对密码做了上面的简单加盐,所以常见的“密码”变成了“pkakskskwkokrkd”,我有我的“彩虹表”(输入列表及其哈希值),我可能不会有(加盐形式)在那张表中,但是假设我知道哈希,并且您将 ks 放在字母之间,我必须使用单词重新创建我的彩虹表,但其中包含 ks,这会占用大量内存,很多时间.....但是我可以破解你所有的密码(因为盐对所有人都是一样的)

这就是你的系统所说的“用户盐”的意思,这样如果我用 ks 破坏系统,只有一个人的东西被破解,我必须为每个人做。

现在获取一些 PHP 代码!

我建议您使用 sha512 salt,这会为任何输入提供固定的 128 个字符长(它是 PHP,最终会在数据库中)输出。

$hash = hash("sha512",$data);

要对其进行加盐,您可以对其进行多次散列,您可以将 ak 放在它之间,只要它对于给定的输入是“确定的”相同。

最后它是如何工作的:

如果银行有我的密码的加盐哈希,他们不会“破坏”它,让我的密码与我输入的数字进行比较,他们对我刚刚输入的密码进行加盐和哈希,然后比较值与数据库中的结果,如果哈希相同,则输入的引脚相同。

散列可能会发生冲突,但这是非常罕见的,“雪崩效应”已被研究并确保在散列算法中存在(术语?),类似的输入会产生截然不同的输出。

哈希仅适用于相等性测试。

于 2013-08-26T21:37:29.807 回答