有没有办法在PHP中生成一个长字符串(例如280个字符)而不必使用一个循环遍历280次的for
循环?我需要它来创建自定义会话ID。
在我看来,PHPSESSID不够安全,因为它太短并且不够随机。我知道Facebook和Twitter使用长会话ID(分别为150、550个字符)。
可能有一个选项可以使用不同字符串(如PHPSESSID、主机、User-Agent等)的MD5
字符串或Bcrypt
加密,但我不确定这是否是正确的方法。
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");
cryptography
,而我正在开发的应用程序需要更高的安全性。所以,我发布了这个问题,想知道别人对此有什么看法,最常见的方法是什么,我可以使用一个loop
来生成一个字符串,并将其与用户User-Agent
的md5
连接起来,但不确定是否正确。 - Andrei Stalbesession.entropy_file
设置为/dev/urandom
。这是唯一可以将实际熵增加到可接受水平的方法。当您将其留空时,@AndreiStalbe所指示的问题会发生,php实际上使用rand()
。但不,您不需要做任何花哨的事情。总的来说,永远不要以Facebook或Twitter作为您应该做的示例,它们有大多数开发人员只能梦想解决的问题(和专家来解决)。简单地说“但他们做x”并没有什么帮助... - ircmaxell它可以是十六进制吗?
bin2hex(mcrypt_create_iv(140, MCRYPT_DEV_URANDOM));
如果您可以访问hash_pbkdf2()
:
hash_pbkdf2('sha256', PHPSESSID, mt_rand(), 1, 280, false);
bin2hex(mcrypt_create_iv(140, MCRYPT_DEV_URANDOM))
。 - Bababcrypt
或PBKDF2
)被设计成需要大量的时间,这对于哈希密码而言是有利的,因为你需要很长时间才能找出原始密码。但如果要生成一个随机字符串,它完全不适合,所得到的ID将不会更加唯一或不可预测。第一种方法使用mcrypt_create_iv()
最适合这项工作。 - martinstoecklisha256
。这就像编写一个for循环,当您知道它仅运行一次时。迭代不会改善结果,只会让服务器变得繁忙。 - @Alix Axel - martinstoecklisha256
永远不会产生 280 字节的字符串,而 PBKDF2 会。2. 迭代实际上会改善结果(从安全角度来看)- 虽然我认为这与 OP 的目标无关,这也是我更改它的原因。 - Alix Axel默认情况下,PHP会话ID还不错,可以通过提供额外的熵(例如来自/dev/urandom)来改善。
请查看php源代码中的ext/session/session.c中的php_session_create_id。
这是它的流程:
因此,获取重复的或预测会话ID相当困难。创建一个长字符串并随机打乱它。
$string = 'asdfhdfiadfshsdfDSGFADSFDSFDSFER524353452345';
$new_string = shuffle($string);
for ($i = 0; $i < 280; $i++) $buffer .= $characters[rand(0, $charactersLength)];
- h2ooooooo