【发布时间】: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
}
?>
这似乎是一个明显的安全问题,不是吗?
或者我做错了什么?
【问题讨论】: