3

有谁知道如何string在 PHP 中生成一个长的(例如 280 个字符)随机字符,而不必使用for循环遍历字符 280 次的循环?我需要它来创建自定义会话 ID。

在我看来,PHPSESSID 太短且不太随机,不够安全。我知道 Facebook 和 Twitter,使用长会话 ID(分别为 150、550 个字符)。

可以选择使用MD5字符串或Bcrypt加密不同的字符串,例如PHPSESSID主机、用户代理等,但我不确定这是正确的做法。

4

4 回答 4

11

如果您要问这样的问题,那可能意味着您对密码学或安全性一无所知。尝试生成“长随机字符串”,因为正如您所说,“PHPSESSID 不够安全”可能会导致您使用自定义且不安全的实现。

生成随机字符串是不可能的,至少在您当前的硬件上不是:您可以近似一个公平的伪随机生成器,但这仅对教育目的有用。

PHP 的 Session ID 生成算法相当高效;如果您认为它不够安全,那么您可能会浪费时间来改进它。如果您正在寻找最大的安全性(例如使用客户端证书),您可能希望使用不同的身份验证机制。

如果 Twitter、Facebook 或其他具有类似流量的网站使用更长的会话 ID,这可能不是因为它更安全(在某种程度上),而是因为它避免了冲突。

最后,如果您想要更长的会话 ID 而不尝试编写自己的算法,您应该使用以下 PHP 配置指令:

session.hash_function它可以采用 PHP 已知的任何哈希算法。

您可能还想使用session.bits_per_characters来缩短或延长字符串。请注意,如果您这样做,字符串可能会更长或更短,但数据保持不变——只是表示方式不同(以 16 为基数、以 32 为基数等)

附加信息:

您还可以通过使用自定义源(文件)并设置种子的长度来增加熵:

ini_set("session.hash_function", "sha512");
ini_set("session.bits_per_charater", 4); // 4 means hex
ini_set("session.entropy_file", "/dev/urandom");
ini_set("session.entropy_length", "512");
于 2012-10-14T19:01:21.860 回答
5

它可以是二进制十六进制吗?

bin2hex(mcrypt_create_iv(140, MCRYPT_DEV_URANDOM));

或者,如果您有权访问hash_pbkdf2()

hash_pbkdf2('sha256', PHPSESSID, mt_rand(), 1, 280, false);
于 2012-10-14T18:49:28.103 回答
4

您可能会发现,并非“长”会话 id 中的所有位都是纯随机的 - 它们可能会为应用程序提供额外信息,以实现关键信息的快速提取。

默认情况下 PHP 会话 id 并不算太糟糕,并且可以通过提供一些额外的熵来改进(例如来自 /dev/urandom)

查看php源码中ext/session/session.c中的php_session_create_id

它是这样的:

因此,获取副本或预测会话 id 非常困难。

于 2012-10-14T19:00:41.823 回答
-2

给自己做一根长绳子,然后洗牌

$string = 'asdfhdfiadfshsdfDSGFADSFDSFDSFER524353452345';
$new_string = shuffle($string);
于 2012-10-14T18:46:21.523 回答