【问题标题】:How to generate a random salt for hashing passwords [duplicate]如何为散列密码生成随机盐[重复]
【发布时间】:2013-01-17 04:23:03
【问题描述】:

可能重复:
Secure hash and salt for PHP passwords

我想生成一个随机盐,然后将它与密码一起存储在用户数据库中。所以我认为是这样的。

$salt = //random salt code
$hpassword = crypt($password,$salt)

【问题讨论】:

  • crypt 对盐值有非常具体的要求。您想使用哪种散列?
  • 我听说 bcrypt 是最好的,所以我猜?

标签: php hash passwords salt saltedhash


【解决方案1】:

PHP 5.5 版将内置支持 BCrypt、函数password_hash()password_verify()。对于 PHP 5.3.7 及更高版本,存在 compatibility pack,您可以在其中找到如何使用函数 mcrypt_create_iv() 创建盐的良好实现,请参见第 86 行和第 121 行。

由于这个兼容包,你也应该考虑直接使用这个函数,而不是自己写,在这里你可以找到一个example。尤其是为 BCrypt 创建盐是一件棘手的事情,而且会犯很多错误。

附:盐应该尽可能随机(从操作系统的随机源读取),因为这是在确定性计算机上使其唯一不可预测的最佳方式。

【讨论】:

    【解决方案2】:

    尝试散列现有字段(例如用户名)并将其用于盐。

    在这里试试:http://en.wikipedia.org/wiki/PBKDF2

    【讨论】:

    • 有人说你不应该使用现有的字段,而是有一个随机的盐:*.com/a/2248920/14955
    • 其他人不同意 :) 如果密码足够强大(递归散列),彩虹表将变得无用。 (另一方面,如果您存储的盐被泄露,如果您使用弱算法,请告别您的密码)...
    • 在将现有字段用作盐之前先用自己的算法打乱现有字段怎么样?