通常我们使用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_bytes
或mcrypt_create_iv
时,我经常看到相同的哈希值。
$2y$08$$$$$$$$$$$$$$$$$$$$$$.UrC6Lo4LNk8iLmoi25KEoVzHHTK7tNC
我看了上面的哈希10次。
当我使用mt_srand
时,哈希根本不会改变。
我在另一个更简单的包装器中测试相同的函数,找到here,它们的行为与我上面描述的相同。
我是哈希和crypt
的初学者。我很困惑,我应该用什么?
答案 0 :(得分:2)
使用openssl_random_pseudo_bytes()
是你在php中可以做的最好的随机字节。
我不确定你要对substr()
做什么,因为openssl_random_pseudo_bytes()
返回字节,而不是偏移量。
为了澄清,您可以单独使用openssl_random_pseudo_bytes(64)
来生成64字节的盐。