[英]Long random string generator in PHP
有沒有人知道如何在PHP中生成一個長的(例如280個字符)隨機string
,而不必使用將循環字符280次的for
循環? 我需要它來創建自定義會話ID。
在我看來,PHPSESSID不夠安全太短而且不太隨機。 我知道Facebook和Twitter,使用長會話ID(分別為150,550個字符)。
可以選擇使用MD5
字符串或不同字符串的Bcrypt
加密,如PHPSESSID
,主機,用戶代理等,但我不確定這是否正確。
如果你問這樣的問題,可能意味着你對密碼學或安全性一無所知。 試圖生成一個“長隨機字符串”,因為正如你所說,“PHPSESSID不夠安全”可能會引導你進行自定義和不安全的實現。
生成隨機字符串是不可能的 ,至少不是您當前的硬件:您可以近似一個公平的偽隨機生成器,但這僅用於教育目的。
PHP的會話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");
它可以是
二進制
十六進制嗎?
bin2hex(mcrypt_create_iv(140, MCRYPT_DEV_URANDOM));
或者,如果您有權訪問hash_pbkdf2()
:
hash_pbkdf2('sha256', PHPSESSID, mt_rand(), 1, 280, false);
您可能會發現並非“長”會話ID中的所有位都是純隨機的 - 它們可能會為應用程序提供其他信息,以便快速提取關鍵信息。
PHP會話ID默認情況下也不錯,可以通過提供一些額外的熵來改進(例如來自/ dev / urandom)
查看php源代碼中ext / session / session.c中的php_session_create_id
它是這樣的:
因此,獲取重復或預測會話ID非常困難。
讓自己成長串並將其洗牌 。
$string = 'asdfhdfiadfshsdfDSGFADSFDSFDSFER524353452345';
$new_string = shuffle($string);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.