在PHP应用程序中,我通过从dev / urandom读取一些字节来创建会话ID,然后使用bin2hex()将每个字节转换为hex。我想知道这种方法是否合适,或者转换为十六进制是否会削弱SID,因为可能的组合数量减少了?有更好的方法吗?
答案 0 :(得分:0)
bin2hex()
只有在强加了字符限制时才会有危险。如果你读取20个字节的熵来填充20个字符的十六进制,那么你也可以从操作系统中提取10个字节。
但是,如果您从20字节的原始二进制文件到40个十六进制字符,那么就不会发生安全性丢失。
答案 1 :(得分:0)
您的问题实际上是“如何生成一串随机十六进制数字?” 如果是这样,这是你的答案(需要PHP 5.3或更高版本):
function getRandomHex($num_bytes=4) {
return bin2hex(openssl_random_pseudo_bytes($num_bytes));
}
请注意,如果$ num_bytes> 7,该值不能在PHP中表示为数字而不会丢失精度。一个五字节的值(10个十六进制数字)大约有十分之一的碰撞机会。