可能重复:
Is “double hashing” a password less secure than just hashing it once?
我在PHP中使用sha1加密密码,但我想知道散列散列是否比仅散列密码更安全。
例如:
时
$hash = sha1($pwd);
比
更安全$hash = sha1(sha1($pwd));
我不明白为什么它不会,因为反向查找网站将无法找到哈希哈希的匹配。
答案 0 :(得分:2)
双重哈希并没有真正帮助。 Salting确实如此。
答案 1 :(得分:2)
为了确保您的密码存储安全,您不应使用sha1
或任何其他快速哈希算法,而应使用密钥派生函数,例如 BCrypt 。< / p>
快速算法的问题是,您可以使用通用硬件(in 2012)计算每秒3 Giga sha1-hashes。这样就可以在不到一毫秒的时间内用大约500000个字来强制整个英语词典!
你的例子中的第二个问题是缺少盐。如果您不为每个密码使用唯一的salt,攻击者可以构建一个rainbow-table来获取所有密码。
BCrypt专门用于哈希密码,因此慢(需要一些计算时间)。通过成本因素,您可以根据未来(因此更快)的硬件调整所需的时间。在内部它做了类似于你的建议,它重复散列很多次,但是以安全的方式。
使用BCrypt可以像使用sha1哈希一样简单。 PHP 5.5将准备好自己的函数password_hash()
和password_verify()
,以简化此任务。 PHP 5.3 / 5.4还有一个compatibility pack,可在password_compat下载。
答案 2 :(得分:-2)
首先,像sha1一样弱,它比明文存储密码更好。任何加密,散列或其他混淆都比明文好得多!
sha1的问题在于它的速度快,因此它可以快速生成哈希来破解。 Salting有很多帮助,但如果您的服务器遭到入侵,并且您的salt哈希值存储为某个字符串,那么就会有这样的优势......
如果您不想使用mcrypt或其他加密方法,可以将sha1哈希混淆如下:
$my_super_sha1_hash =
sha1(
sha1(
substr(
sha1($username)
, 0
, strlen($password)
)
)
.sha1(
substr(
sha1($password)
, 0
, 40-strlen($password)
)
)
);
通过将用户名和密码混合在一起,并使用(未知)密码的长度来确定每次在sting中使用的每个位然后再次进行哈希处理,每个盐都是唯一的但不是随机的,因此结果是所有用户都保持一致,因为必须考虑密码和用户名的字符串长度,因此很难破解。