都不行
您应该使用
bcrypt。您提到的散列均经过优化,可在硬件上快速便捷地使用,因此破解它们具有相同的品质。如果您别无选择,至少要确保使用长盐并多次重新哈希。
在PHP 5.5+中使用bcrypt
PHP5.5提供了用于密码哈希的新功能。这是在现代Web应用程序中存储密码的推荐方法。
// Creating a hash$hash = password_hash($password, PASSWORD_DEFAULT, ['cost' => 12]);// If you omit the ['cost' => 12] part, it will default to 10// Verifying the password against the stored hash if (password_verify($password, $hash)) { // Success! Log the user in here.}如果您使用的是旧版本的PHP,则确实应该升级,但是在您这样做之前,您可以使用password_compat公开此API。
另外,请让我们
password_hash()为您生成盐。它使用CSPRNG。
bcrypt的两个警告
- Bcrypt会自动截断任何长度超过72个字符的密码。
- Bcrypt将在任何
NUL
字符后截断。
(这里有两个警告的概念证明。)
在通过bcrypt运行密码之前,您可能会通过预先散列密码来解决第一个警告,但这可能会使您的应用程序先运行到第二个。
不用编写自己的方案,而使用由安全专家编写和/或评估的现有库。
ZendCrypt
(Zend framework的一部分)提供BcryptSha
PasswordLock
与相似,BcryptSha
但它还使用认证的加密库加密bcrypt哈希。
TL; DR - 使用bcrypt。



