簡體   English   中英

PHP中的長隨機字符串生成器

[英]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

它是這樣的:

  • 得到時間
  • 獲取遠程IP地址
  • 使用當前時間的秒和微秒以及IP地址構建一個字符串
  • 將其提供給配置的會話哈希函數 (MD5或SHA1)
  • 如果已配置,則從熵文件中提供一些額外的隨機性
  • 生成最終哈希值

因此,獲取重復或預測會話ID非常困難。

讓自己成長串並將其洗牌

$string = 'asdfhdfiadfshsdfDSGFADSFDSFDSFER524353452345';
$new_string = shuffle($string);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM