了解 PHP 会话熵
Understanding PHP Session Entropy
在 php.ini
的 session
部分有一个名为 session.entropy_length
的指令。
我知道它用于生成会话 ID "more random"。
如何让Session ID更加随机?
最大长度是多少?
如果它的长度超过了正在使用的hash
的位数怎么办?
session_id
是客户端 IP 地址(32 位)、当前时间戳和微秒(52 位)的哈希值,以及从 php combined lcg()
生成的值,伪随机数生成器(PRNG) 函数(64 位)。熵为 148 位。然而,这个数字不应被视为绝对最小值,因为 IP 地址和时间戳从创建会话的人那里是众所周知的。
当可用的熵量过低时,可以从会话 ID 重建 PRNG 的 seed。由于 PHP 在不同生成器之间重用相同的熵源,这就更容易了。
种子是用来产生其他伪随机值的,所以如果攻击者能够得到种子值就可以预测所有未来的输出(包括但不仅限于mt_rand()
和rand
) .这样不好。
session.entropy_length
是将从熵文件中读取的字节数,通常是/dev/urandom
或/dev/arandom
(from documentation)。
如果你提供像/dev/random
这样的随机源,那么熵就越大,生成的session_id
强度就越大
在 php.ini
的 session
部分有一个名为 session.entropy_length
的指令。
我知道它用于生成会话 ID "more random"。
如何让Session ID更加随机?
最大长度是多少?
如果它的长度超过了正在使用的
hash
的位数怎么办?
session_id
是客户端 IP 地址(32 位)、当前时间戳和微秒(52 位)的哈希值,以及从 php combined lcg()
生成的值,伪随机数生成器(PRNG) 函数(64 位)。熵为 148 位。然而,这个数字不应被视为绝对最小值,因为 IP 地址和时间戳从创建会话的人那里是众所周知的。
当可用的熵量过低时,可以从会话 ID 重建 PRNG 的 seed。由于 PHP 在不同生成器之间重用相同的熵源,这就更容易了。
种子是用来产生其他伪随机值的,所以如果攻击者能够得到种子值就可以预测所有未来的输出(包括但不仅限于mt_rand()
和rand
) .这样不好。
session.entropy_length
是将从熵文件中读取的字节数,通常是/dev/urandom
或/dev/arandom
(from documentation)。
如果你提供像/dev/random
这样的随机源,那么熵就越大,生成的session_id
强度就越大