首先如果你对密码学的概念以及使用并不熟悉,或者你正需要进行一些密码学的引导,那么我推荐你阅读一下这篇内容。
此前我们就曾明确的表示,即使是安全建议也应该有个保质期。因此和我们过去发布的大多数博客文章不同,上面那篇内容实际上是处在一种“随时更新”的状态:当对安全的需求变化以及新的攻击形式被发现时,我们都会做出相应的变更。
这里我们提出一个密码安全观点:不要存储明文密码,而是存储密码的哈希值。
事实上现在,生成安全的密码哈希值非常简单。
但这里有个问题就是,你可能希望别人可以设置一个带密码的帐号,通过这个帐号和密码,别人可以登录到你的程序中,那么这一功能要怎样才能安全的实现?
而解决这个问题也很简单使用libsodium。它可以为大多数语言提供一个安全的密码哈希API。在1.0.8版本之前它使用的是scrypt算法,但从1.0.9版本开始,它还会提供Argon2,这是从最近的哈希密码对比中精心挑选出来的一个算法。Libsodium会提供对大多数编程语言的绑定。
Libsodium文件
Libsodium源码
注意:这里公布了一个对Argon2i的攻击Argon2通用密码哈希的变种表示。实际上它的影响并不严重,但它可能会导致一个新的变种(也许是Argon2x,因为它可能会使用XOR而不是覆盖内存来缓解这些攻击)。
如果你因为种种原因无法在安装libsodium和你的要求之间进行调和的话,你还有其他的选择。在准备这篇博客时,我们的团队已经研究了多种编程语言的几个密码哈希库,下面就为大家利用示例代码介绍下。
目前可接受的密码哈希算法主要有:
Argon2 密码哈希比赛的冠军
bcrypt
scrypt
以及密码哈希比赛的其他参赛算法 (Catena, Lyra2, Makwa, and yescrypt)
PBKDF2 最糟糕的一种选择
首先确认你使用的版本是否支持PHP。如果支持,那么PHP密码API将能够使用。如果不支持,那么可以尝试进行升级,如果还是不行,检查一下password_compat。
$hash = password_hash($userPassword, PASSWORD_DEFAULT);
显然password_hash()使用的是加盐计算的哈希值。根据自己实际情况进行调整,如果硬件支持的话,使用最小绝对值10.12是很好的,其默认的10。
$hash = password_hash($userPassword, PASSWORD_DEFAULT, ['cost' =