将数据从/ dev / urandom转换为十六进制

时间:2014-02-17 18:53:17

标签: php random session-cookies sessionid

在PHP应用程序中,我通过从dev / urandom读取一些字节来创建会话ID,然后使用bin2hex()将每个字节转换为hex。我想知道这种方法是否合适,或者转换为十六进制是否会削弱SID,因为可能的组合数量减少了?有更好的方法吗?

2 个答案:

答案 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个十六进制数字)大约有十分之一的碰撞机会。