使用salt作为Blowfish哈希的一部分,它是如何更安全的

时间:2014-04-16 17:48:15

标签: php security blowfish

修改:这个问题不是关于向哈希添加盐是什么,如何做,以及它如何提高安全性。

我写了以下代码:

<?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
    }

?>

这似乎是一个明显的安全问题,怎么回事?

做错了什么?

2 个答案:

答案 0 :(得分:3)

有些东西,称为彩虹表。这些是使用大量密码预生成的大型哈希数据库。如果你没有添加盐,可以在彩虹表中轻松查找你的哈希并在几秒钟内破解它。

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

答案 1 :(得分:0)

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

相同的密码将始终产生相同的哈希值,因此您无需将密码存储在任何位置。

如果您将随机字符串添加到密码中,然后加密结果,结果将无法重现,您的密码也无用。

如果您正在使用散列密码进行散列,则可以添加安全性,因为使用了任何技术来反向计算散列,所有可能的结果都将是原始密码+ salt 但盐渍也必须是可重复的