【问题标题】:password salt storing密码盐存储
【发布时间】:2012-05-31 22:19:04
【问题描述】:

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

现在我想做的是使用更强大的东西(也许是 sha256)和每个用户唯一的盐。

问题是关于盐的储存。

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

然后hash salt + password,登录时,从数据库中调用salt和password,合成一个。

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

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

【问题讨论】:

    标签: php authentication passwords hash salt


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

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

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

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

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

      【讨论】:

      • 盐怎么能不保密呢?如果攻击者知道盐,他可以轻松修改字典攻击以包含盐,瞧!
      • @Martins Briedis - 预先计算某个字典的所有哈希值通常称为彩虹表。攻击者不能使用已经存在的公共彩虹表(只是在谷歌上搜索哈希值),因为彩虹表必须完全针对一种特定的盐(或者如果没有使用盐,则针对原始字典)。
      • @Martins Briedis - 忘了提一下,构建彩虹桌不是您在几秒钟内完成的任务。当您使用慢速哈希函数(如 bcrypt)时,它需要很多时间,如果您为每个密码使用不同的盐,那么您需要为每个密码花费很多时间。
      • @chumkiu - 为什么,你会在哪里存储密钥?
      • @martinstoeckli 显然,如果它是秘密的,那么安全性会更高。我们可以讨论我们获得了多少安全性,但我们不能说那是一样的。就个人而言,我将每个项目的一个盐存储在一个配置文件中。
      【解决方案3】:

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

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

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

      【讨论】:

      • 是的,PHPass 可以工作。如果使用上面的 php 5.3,我建议只使用上面的原生 php 函数
      猜你喜欢
      • 1970-01-01
      • 2011-05-09
      • 2015-11-08
      • 2016-04-01
      • 1970-01-01
      • 2012-11-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多