【问题标题】:creating random salt with php's crypt用 php 的 crypt 创建随机盐
【发布时间】:2013-04-18 21:23:22
【问题描述】:

通常我们使用mt_rand 来创建一个随机盐以将其与crypt() 一起使用。 但是根据 php 网站上的mt_rand 手册页“不能用于加密目的[...]考虑改用 openssl_random_pseudo_bytes()。”此外,在 php 网站的 crypt 手册页上,有人建议使用

mcrypt_create_iv

所以,为了测试它们,我使用了this crypt 的包装器并更改了以下行

$salt .= substr("./ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789", mt_rand(0, 63), 1);

//change it to
$salt .= substr("./ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789", openssl_random_pseudo_bytes(63, $cstrong), 50); 

$salt .= substr("./ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789", mcrypt_create_iv(63, MCRYPT_RAND), 50); 

$salt .= substr("./ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789", mt_srand(), 1);

然后我注释了除一行之外的所有行并开始运行代码,以检查每个函数。我刷新了我的页面,验证工作正常。但是当我运行openssl_random_pseudo_bytesmcrypt_create_iv 时,我经常看到相同的哈希值。

$2y$08$$$$$$$$$$$$$$$$$$$$$$.UrC6Lo4LNk8iLmoi25KEoVzHHTK7tNC

上面的哈希我看了 10 次。

当我使用mt_srand 时,哈希值永远不会改变。

我在另一个更简单的包装器中测试相同的函数,发现 here,它们的行为与我上面描述的相同。

我是散列和crypt 的初学者。我很困惑,我应该实际使用什么?

【问题讨论】:

    标签: php crypt


    【解决方案1】:

    使用openssl_random_pseudo_bytes() 是在 php 中获取随机字节的最佳方法。 我不确定你想用substr() 做什么,因为openssl_random_pseudo_bytes() 返回字节,而不是偏移量。

    为了澄清,您可以单独使用 openssl_random_pseudo_bytes(64) 来生成 64 字节的盐。

    【讨论】:

    • 对不起,你是对的,我只是注意到了差异。我会研究更多,让你知道..
    • 只使用openssl_random_pseudo_bytes(64) 听起来不错,但我不能将它与sprintf 一起使用,因为前者产生字节而后者是关于字符串的。所以我不能在我的哈希中包含像$2y$ 这样的东西,它“代表”河豚。我也想不出一种方法来检查散列密码和输入密码...
    • 只需将(已经随机的)数据放入哈希中。例如sha1(openssl_random_pseudo_bytes(64)) 有帮助吗?
    • 另外,如果您要随机加盐密码,则需要将加盐值与散列密码一起存储在数据库中,以便重新计算散列值。如果这是专门关于密码的,则不应将它们与可逆哈希一起存储,例如。河豚。
    最近更新 更多