1

我想创建一个会员网站,所以我想让密码尽可能安全。我可以从包括这个网站在内的阅读网站中看到,md5、sh1 加密是一个严重的不,不。我见过一些其他的东西,比如 bcript、scrypt、sha256、sha512 和 PBKDF2。我发现了一些实现这些的 php 脚本,但并没有真正找到与数据库有关的任何注意事项。

我必须创建一个包含盐的行吗?

验证密码我必须做类似哈希(盐+密码)= $哈希之类的事情吗?

因为我不是最有经验的密码我不太确定最佳实践,当你散列密码+盐时会发生什么,如何检索密码......

我想因为我真的不明白它背后的逻辑,所以我对如何去做感到有点困惑。

4

2 回答 2

4

如果您使用 Bcrypt、Scrypt 或 PBKDF2,salt 是您获得的哈希的一部分,所以不,您不必担心单独存储它。否则(SHA-*),是的——无论如何你都不应该使用这些。Bcrypt、Scrypt 和 PBKDF2 是实际的密码散列函数。

我推荐 Bcrypt,因为你标记了这个。它是内置的。Scrypt 不是。

于 2012-12-16T15:12:51.937 回答
1

一个常见的最佳实践(参见例如 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 模块

于 2012-12-16T15:18:41.777 回答