13

我正在创建一个游戏社区网站,我的目标是尽快向公众发布。目前,我正在处理密码和登录。我以前只使用过 MD5,但我读过有关密码安全的内容,听说加盐是目前要走的路。

这是我的计划:每个用户都有自己独特的 12 个随机字符(#/¤& 等)的盐,存储在 users 表中。盐在注册时与密码一起被散列(使用 SHA-256),并在登录时重新散列。

你觉得这听起来如何?有什么我可以改进的吗?我应该选择 SHA-512 和更长的盐,还是这样就足够了?

4

6 回答 6

17

您对 12 个字节的建议对于盐来说应该是足够的长度。这将需要字典攻击来准备 2 96个散列密码数据库。有朝一日,这对于一个破解者来说可能是一项微不足道的操作,但我们离那还有一段路要走。

NIST 推荐 SHA256 具有足够的密码散列强度,至少目前是这样。

如果您想探索更强大的密码安全方法,请研究密钥强化技术,如PBKDF2或使用Bcrypt的自适应散列。但这些在 SQL 中没有直接支持。您必须在应用程序代码中进行哈希处理,然后将哈希摘要发布到您的数据库中。

对于游戏网站来说,这似乎是安全过度,但这是一个很好的做法。因为许多用户(不建议)使用相同的密码进行游戏登录和银行登录!您不想对间接导致重大损失的身份验证违规负责。

于 2010-07-07T03:48:18.750 回答
4

更新:

不要使用散列或 HMAC。使用bcryptscrypt。请参阅http://codahale.com/how-to-safely-store-a-password/

原来的:

不要简单地散列。使用 HMAC。(如果有可用的库,请避免进行自己的散列或加密,因为库从专家输入中受益。)

参考:

  1. http://rdist.root.org/2009/10/29/stop-using-unsafe-keyed-hashes-use-hmac/
  2. http://us2.php.net/manual/en/function.hash-hmac.php
于 2010-07-07T04:58:13.717 回答
3

对于您的用例来说,这可能就足够了。

但是,它可以通过以下方式改进:

  1. 增加盐的大小

  2. 盐不应仅限于一小部分字符

  3. 迭代散列,比如 1000 次(关键加强)

看看phpass

于 2010-07-07T03:36:00.913 回答
1

我注意到关于如何正确进行密码散列的很多困惑,尤其是在 stackoverflow 上。而且我看到了一些非常糟糕的建议。所以我写了一个应该清除所有内容的页面。除了使用简单的哈希之外,还有更多内容。

更多信息和源代码:如何正确进行密码散列

每当有人对密码哈希有疑问时,请随时分享此链接。这是我在 stackoverflow 上的第一篇文章,如果我做得不对,请见谅

于 2011-03-25T20:43:51.000 回答
-1

如果您真的很担心,我会考虑使用漩涡散列函数而不是 SHA 变体之一。Whirlpool 已被证明是一种非常强大的哈希方法,并且没有碰撞历史或任何其他弱点(至少我知道)。

您可以通过使用PHP的哈希函数来使用漩涡。(但请注意, hash() 需要 PHP 5.1.2 或更高版本。)

于 2010-07-07T04:57:07.060 回答
-2

您目前的方法就足够了。

于 2010-07-07T03:38:06.230 回答