一个常见的最佳实践(参见例如 Linux passwd)是将密码哈希存储为
$<algorithm>$<salt>$<hash>
例如这个字符串:
$6$Lxgyf7h6DtkrqwT$0w/BoB6neYjEtdQdUEs3ftnnNguBNTug8.g/9UeMmZ9bN/cDJCE0dj8.4D/8HPN5bMqFPJ4ECnGl5M2iqBmmv/
是一个加盐的 SHA-512(算法 id 6
)密码哈希Lxgyf7h6DtkrqwT
,大多数服务器都应该理解它。
这样做的好处是您实际上可以同时支持不同的算法。因此,一些用户可能仍然拥有例如 SHA-256 密码,而对于任何更改其密码的用户,您需要切换到更安全的算法。
阅读有关模块化散列方案的一个很好的起点,请阅读 Wikipedia 中有关crypt (Unix)函数的这篇文章。周围的炒作bcrypt
(以及crypt
等同于 DES 散列的错误信息)表明 PHP 开发人员在密码安全方面有些天真。bcrypt 还不错(嗯,它依赖于计算复杂性而不是更强大的算法 AFAIK,但它似乎确实击败了 MD5)。但是我建议使用类似这种方案的东西,它是 A) 可移植的和 B) 可扩展的,这样您就可以随时顺利过渡到更强的密码哈希。
在 99% 的编程语言(包括 PHP)中,此功能可通过该函数开箱即用crypt
,方法是选择适当的 salt,以 salt 字符开头$6$
和适当的长度。
并清理bcrypt 倡导者系统传播的一些错误信息:这不仅仅是使用一轮sha-512,而是使用默认值(参见http://www.akkadia.org/drepper/sha-crypt.html)是5000 轮 SHA-512。并且您可以选择增加数量。因此,据我了解,“但 bcrypt 可以在需要时扩大规模”的说法也适用于 crypt-SHA512。与bcrypt 相比,这应该可以在任何使用glibc 2.7 及更高版本的 Linux 系统上使用。bcrypt 是仅在某些发行版或某些扩展上可用的扩展。在 Debian 和可能的 Ubuntu 上,您显然需要安装扩展
libpam-unix2 - 支持 Blowfish 的 PAM 模块