【问题标题】:With the salt as part of a Blowfish hash how is it more secure [duplicate]将盐作为 Blowfish 哈希的一部分如何更安全[重复]
【发布时间】:2014-04-16 17:48:14
【问题描述】:

编辑:这个问题不是关于向哈希中添加盐是什么,如何做到这一点,也不是它如何提高安全性。

我写了以下代码:

<?php

    $salt = '';
    $salt_alphabet = str_split('aAbBcCdDeEfFgGhHiIjJkKlLmM.nNoOpPqQrRsStTuUvVwWxXyYzZ/');
    $salt_prefix = (version_compare(PHP_VERSION, '5.3.7') < 0) ? '$2a' : '$2y';

    foreach (array_rand($salt_alphabet, 20) as $alphameric) {
        $salt .= $salt_alphabet[$alphameric];
    }

    if (defined('CRYPT_BLOWFISH') and CRYPT_BLOWFISH) {
        echo crypt('thisisasuperpassword', $salt_prefix . '$07$' . $salt . '$$');
    }

?>

它会像这样输出 Blowfish 哈希:

$2y$07$acEfghiKL.OprtuwyYZ/$.j7uui28rXLPyAcDzGBfQbbvQL6a.kk2

如果有人得到这个哈希,那么哈希本身中的盐如何安全?

人们说 Blowfish 是目前最安全的加密方式,但像 SHA-256 这样的哈希加密不会显示在哈希本身中使用或不使用什么盐,这似乎更安全。散列中加盐的目的不是为散列添加随机性吗,如果您将随机性作为散列的一部分,它怎么能更安全?

与上面的哈希一样,“acEfghiKL.OprtuwyYZ/$”是盐,就像白天一样,就在哈希本身中。只需将这种盐添加到他们已经在彩虹表、哈希数据库或其他东西中拥有的值中,就可以了,盐的目的就被打破了。

或者不是以某种方式?

例如,一旦将数据库加载到数组中,您所要做的就是:

<?php

    foreach ($hashes as $hash) {
        $salt = explode('$', $hash)[3];
        // Proceed to use the salt to crack the hash
    }

?>

这似乎是一个明显的安全问题,不是吗?

或者做错了什么?

【问题讨论】:

    标签: php security blowfish


    【解决方案1】:

    有些东西,叫做彩虹桌。这些是预先生成大量密码的巨大哈希数据库。如果您不添加盐,人们可以轻松地在彩虹表中查找您的哈希并在几秒钟内破解它。

    基本上,您在暴力破解中使用的所有这些组合都已经在数据库中,并针对超快速搜索进行了优化,而不是暴力破解密码。但是一旦你添加了盐,就会增加密码的长度和随机性,并且无法在彩虹表中找到。

    【讨论】:

    • 彩虹表上的维基百科条目:en.wikipedia.org/wiki/Rainbow_table
    • 我很清楚向哈希值添加盐的作用以及它如何提高安全性,我不是在问这个问题。河豚散列包括盐,如果有人,如你所说,正在使用散列数据库,他们可以轻松地将每个散列盐添加到数据库中的每个值,然后他们会回到只是在他们的数据库中查找散列。这似乎完全违背了盐的目的。我的问题是:“这个假设是错误的吗?”
    • 错了。我再重复一遍,因为我可能解释得不够清楚:彩虹表是有限的——它们只包含相对少量的散列。它们适用于常见的密码散列或不超过一定数量字符的单词散列。但只要你用 SALT 加密密码 - 彩虹表就不会再有这样的哈希值了。另外:您不能在彩虹表中的哈希中添加盐 - 盐是在散列操作之前添加的 - 而不是之后。因此,为了查找加盐密码,您需要重新生成整个彩虹表,并将盐添加到每个组合中。
    • 哈希数据库也将包含非哈希值。使用 Blowfish,您可以非常轻松地将盐添加到非散列值中,这违背了目的。例如,使用上述代码散列为 Blowfish 的“1234”密码为“$2a$07$acEfghiKL.OprtuwyYZ/$ecRuoVMd57956GZZ5B.DTWYaeK57wmti”,要想找出密码,只需检查 crypt('1234', ' $2a$07$' . $salt) === $hash。这比不显示盐的 SHA-256 更安全吗?
    • 您刚刚回答了自己的问题。彩虹表将包含“1234”的哈希,但不会包含“1234”+盐的哈希。这使任何在其中查找密码的希望都落空了。您仍然可以按照您的建议使用 crypt() 找到密码,但这称为暴力破解,与彩虹表无关。盐并不是为了保护你免受这种伤害。但是,如果您按照自己的方式进行操作,则可能需要数百万年才能检测到密码,而未加盐的密码可以在彩虹表中以超快的速度查找。
    【解决方案2】:

    Blowfish 是加密,sha 是散列。最大的区别是加密是可逆的,而散列不应该是可逆的。

    相同的密码总是会产生相同的哈希值,因此您无需将密码存储在任何地方。

    如果你在密码中添加随机字符串,然后对结果进行加密,结果将无法重现,你的密码也是无用的。

    如果你为哈希加盐密码,你增加了安全性,因为无论使用什么技术来反向计算哈希,所有可能的结果都将是原始密码 + 加盐 但盐渍也必须是可重复的

    【讨论】:

      猜你喜欢
      • 2019-03-13
      • 1970-01-01
      • 2019-09-03
      • 2010-09-28
      相关资源
      最近更新 更多