会强多少
return sha1($salt.sha1($passwd));
可以比作:
return sha1($salt.$passwd);
$salt
是长度为 12 的每个用户字符串,由强随机 ASCII 组成。
它的强度正好是原来的两倍,因为攻击者需要为蛮力攻击执行两倍的 SHA1 计算。
当然,这仍然不是很令人印象深刻。另一方面,在一个循环中执行 SHA1 5000 次对于授权来说是可行的,但会使攻击花费 5000 倍的时间——这种技术被称为密钥强化。然而,它实际上只是 Jacco 提到的适应性成本散列算法的一个穷人的替代品。
乍一看,如果没有深厚的加密知识,我会说它一点也不强大。
顺便说一句,通常建议使用
sha1($login.$salt.$passwd);
这样 2 个具有相同密码的用户就不会具有相同的哈希值。
据我所知,实力没有区别。
由于通常的做法是在密码哈希之前添加盐,因此攻击者通常知道盐。但这并没有破坏盐的目的。
一般而言,将 $login/$username 添加到散列(Vinzz的解决方案)不是一个好主意,因为如果用户更改他或她的用户名会导致问题。更好的解决方案是使用随机 salt。
使用的散列算法确实有所作为。SHA1
被认为是密码损坏,不应用于散列密码。
一般来说 BCRYPT
(基于 Blowfish 的自适应成本散列算法)被认为是最好的做法( PHP 的crypt();CRYPT_BLOWFISH
的标志)
其他可靠的选项是 SHA256 及更高版本。
编辑:
我在这里写了一个关于加盐的更长答案:stackoverflow.com/questions/1645161/salt-generation-and-open-source-software/