2

我想更新当前仅使用 MD5 的密码设置。

现在我想做的是使用更强大的东西(也许是 sha256),每个用户都有独特的盐。

问题是关于盐的储存。

我是否将盐存储在数据库中自己的列中?

然后哈希盐+密码,当涉及到登录时,从数据库中调用盐和密码,使其成为一个。

还是我通过使用用户名、电子邮件和时间戳来制作盐的方式,这也将为每个用户提供一个独特的盐?

我想知道,如果有人持有以盐为列的数据库,他们会知道每个用户的盐,然后他们就可以破解密码。

4

3 回答 3

5

盐不是秘密,它可以与哈希一起存储明文。甚至不需要在数据库中有第二个字段。如果您查看 PHP 的crypt()函数,您可以看到,盐值将包含在哈希值本身中。

这是盐的工作,使已经存在的彩虹表无用,因为必须为一种特定的盐构建彩虹表。为每个散列使用不同的盐将防止彩虹表攻击,因为您必须为每个散列创建一个彩虹表。这就是为什么不需要对盐保密的原因。

我建议,如果你想改进你的密码哈希系统,你做对了,使用慢的哈希函数。使用 bcrypt 的密码散列一文解释了为密码生成散列的要点。

  • 每个密码生成一个盐,而不是每个用户。
  • 使用随机(唯一)盐,而不是从其他参数派生的盐。
  • 使用慢散列函数。

最后但同样重要的是,不要害怕正确地执行它,您的应用程序的代码可以像您当前使用 MD5 实现一样简单。

于 2012-05-25T11:23:03.370 回答
2

忘记 MD5 或 SHA。使用 Bcrypt。(Blow Fish Crypt) 自带 PHP 5.3 及更高版本。(加密方法 2a)它更安全且处理速度更慢。

使用 Bcrypt 时,盐与哈希一起存储在同一个 feild 中。没有理由分开一个。

http://php.net/manual/en/function.crypt.php

于 2012-05-25T12:27:26.117 回答
0

刚刚阅读另一篇文章,有人说盐不是秘密,可以存储在数据库列中。所以这回答了我的问题

于 2012-05-25T10:23:43.293 回答