如何生成随机的长盐用于散列?

Ton*_*ark 14 php salt-creation

在PHP中制作随机可变长度盐用于散列的方法是什么?假设我想制作一个16个字符的长盐 - 我该怎么做?

Vol*_*erK 60

编辑:已弃用mcrypt扩展名.对于新项目,请查看
random_bytes(int $ length)
sodium(截至php 7.2 core-)扩展.


如果mcrypt扩展可用,您只需使用mcrypt_create_iv(size,source)来创建salt.

$iv = mcrypt_create_iv(16, MCRYPT_DEV_URANDOM);
var_dump($iv);
Run Code Online (Sandbox Code Playgroud)

由于"字符串"的每个字节可以在0-255之间的范围内,因此需要二进制安全函数来保存/检索它.

  • 到目前为止这个帖子中的最佳答案.密码PRNG是要走的路. (6认同)
  • 这应该是公认的答案.为了您自己的安全,请不要使用XUE Can建议的unique_md5. (2认同)

Joh*_*set 0

好的盐有两个先决条件:一定要长,而且一定要随机。有很多方法可以实现这一点。microtime例如,您可以使用和的组合rand,但您可能会更加努力以确保您的盐是唯一的。

虽然冲突的可能性可以忽略不计,但请记住,使用 MD5 或其他容易发生冲突的算法对盐进行哈希处理将减少盐无缘无故唯一的可能性。

编辑:rand()替换mt_rand(). 正如迈克尔指出的,它比rand.