为了生成一个32个字符的API访问令牌,我们目前使用:
$token = md5(uniqid(mt_rand(), true));
我读到这种方法并不具备密码学安全性,因为它是基于系统时钟的,openssl_random_pseudo_bytes
将是更好的解决方案,因为它更难以预测。
如果是这样的话,那等效的代码会是什么样子呢?
我猜大概是这样,但我不知道是否正确...
$token = md5(openssl_random_pseudo_bytes(32));
还有什么长度是我应该传递给函数的有意义的呢?
md5()
生成32个字符的字符串,但其中只包含128位的数据。openssl_random_pseudo_bytes()
返回真正的二进制数据,因此具有32x8 = 256位的随机性。将32字节的随机字符串通过md5()
处理,会使其独特性大大降低。 - Marc B$token = bin2hex(openssl_random_pseudo_bytes(16));
足够了吗?还是我需要一个循环,进行 16 次迭代,将长度传递为 1 并以十六进制附加到字符串中? - fireRandom::alphanumericString($length)
,它可以将约20亿倍的“熵”装进这16个字符中。 - caw