php - 密码盐存储

标签 php authentication passwords hash salt

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

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

问题是关于盐的储存。

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

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

或者我是通过使用用户名、电子邮件和时间戳来制作盐,这也会给我每个用户一个独特的盐?

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

最佳答案

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

让现有的彩虹表变得无用是盐的工作,因为必须为一种特定的盐构建彩虹表。对每个散列使用不同的盐可以防止彩虹表攻击,因为您必须为每个散列创建一个彩虹表。这就是为什么没有必要对盐保密。

我建议,如果您无论如何都想改进您的密码哈希系统,那么您应该做对,使用速度较慢的哈希函数。文章password hashes with bcrypt解释了为密码生成哈希值的要点。

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

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

关于php - 密码盐存储,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10752615/

相关文章:

php - 仅在单击帖子时显示按钮

php - Facebook API - 不支持获取页面/帖子见解请求

php - 是否有满足这些特定标准的 PHP 基准测试?

api - 为什么要在 `Authorization: Bearer ` header 中发送 token ?

java - 无法使用 java 连接在 MongoDB 3.0.2 中对用户进行身份验证

batch-file - 当我对网络名称使用通配符时,网络的关键内容丢失

php - 我可以使用准备好的语句启用/禁用部分查询吗?

MySQL 纯文本哈希密码

ios - 防止 MitM (https) 使用包含的 pub 加密查看密码。 iOS/Android 应用程序中的 key

java - 如何在 Java 配置文件中存储敏感数据?