修改:这个问题不是关于向哈希添加盐是什么,如何做,以及它如何提高安全性。
我写了以下代码:
<?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
}
?>
这似乎是一个明显的安全问题,怎么回事?
或我做错了什么?
答案 0 :(得分:3)
有些东西,称为彩虹表。这些是使用大量密码预生成的大型哈希数据库。如果你没有添加盐,可以在彩虹表中轻松查找你的哈希并在几秒钟内破解它。
基本上,不是强制使用密码,而是您在暴力中使用的所有组合都已存在于数据库中,针对超快速搜索进行了优化。但是一旦添加了盐,就会增加密码的长度和随机性,并且无法在彩虹表中找到它。
答案 1 :(得分:0)
Blowfish是加密,sha是散列。最大的区别是加密是可逆的,而散列是不可能的。
相同的密码将始终产生相同的哈希值,因此您无需将密码存储在任何位置。
如果您将随机字符串添加到密码中,然后加密结果,结果将无法重现,您的密码也无用。
如果您正在使用散列密码进行散列,则可以添加安全性,因为使用了任何技术来反向计算散列,所有可能的结果都将是原始密码+ salt 但盐渍也必须是可重复的