由 Paragon Initiative Enterprises 建立和維護的random_bytes()
和random_int()
的 PHP 5.x polyfill。
儘管該程式庫應該在早期版本的 PHP 中運行,但我們只會考慮與受支援的 PHP 版本相關的問題。如果您使用的 PHP 版本不受支持,請盡快升級。
儘管這個函式庫已經過 PHP 社群的一些安全專家的檢查,但我們總是有可能忽略一些東西。在考慮將其部署到生產環境之前,請讓您最喜歡的值得信賴的駭客對其實施錯誤和錯誤進行錘煉。
不要使用 master 分支,使用穩定版本。
有關該庫的背景信息,請參閱我們的部落格文章“在 PHP 中生成隨機整數和字串”。
如果 PHP 無法安全地產生隨機數據,則該函式庫將會拋出Exception
。它永遠不會退回到不安全的隨機資料。如果這種情況持續發生,請立即升級到較新版本的 PHP。
與作曲家:
# For libraries and frameworks that support PHP 5 but may be used by # other software that only supports PHP 7: composer require paragonie/random_compat:>=2 # For software that explicitly needs PHP 5 support: composer require paragonie/random_compat:<9.99
簽名 PHP 存檔:
從版本 1.2.0 開始,我們也在 Github 上隨每個穩定版本發布了 ECDSA 簽名的 PHP 存檔。
下載.phar
、 .phar.pubkey
和.phar.pubkey.asc
檔。
(建議但不要求)使用 Paragon Initiative Enterprises 的 PGP 公鑰驗證.phar.pubkey
(包含在.asc
檔案中)的 PGP 簽章。
將.phar
和.phar.pubkey
檔提取到同一目錄。
require_once "/path/to/random_compat.phar";
當新版本發佈時,只需替換.phar
檔案即可; .pubkey
不會改變(除非我們的簽章金鑰被洩露)。
手動安裝:
下載穩定版本。
將文件提取到您的項目中。
require_once "/path/to/random_compat/lib/random.php";
入口點應該直接是lib/random.php
,而不是/lib
中的任何其他檔案。
該函式庫公開了 PHP 7 中新增的 CSPRNG 函數,以便在 PHP 5 專案中使用。他們的行為應該是相同的。
嘗試{$string = random_bytes(32); } catch (TypeError $e) {// 嗯,它是一個整數,所以這是意外的。 } catch (Error $e) {// 這也是意料之外的,因為 32 是合理的整數。 } catch (Exception $e) {// 如果收到此訊息,則 CSPRNG 失敗hard.die("無法產生隨機字串。我們的作業系統安全嗎?"); }var_dump(bin2hex($string));// 字串(64) "5787c41ae124b3b9363b7825104f8bc8cf27c4c3036573e5f0d4a91ad2eeac6f"
嘗試 {$int = random_int(0, 255); } catch (TypeError $e) {// 嗯,它是一個整數,所以這是意外的。 } catch (Error $e) {// 這也是意料之外的,因為 0 和 255 都是合理的整數 die("發生了意外錯誤"); } catch (Exception $e) {// 如果您收到此訊息,則 CSPRNG 失敗 hard.die("無法產生隨機整數。我們的作業系統安全嗎?"); }var_dump($int);// int(47)
處理異常和錯誤時,您必須考慮 PHP 5 和 PHP7 之間的差異。
差異:
只要在Exception
之前捕獲錯誤,捕獲Error
就有效。
捕獲Exception
有不同的行為,之前沒有捕獲Error
。
沒有可移植的方法來捕捉所有錯誤/異常。
始終在Exception
之前捕獲Error
。
嘗試{return random_int(1, $userInput); } catch (TypeError $e) {// 這樣就可以了,只要在 `Exception` 之前捕獲 `Error` 即可。 } catch (Error $e) {// 這是必要的,如果你不需要做任何事情,只需 rethrow.throw $e; } catch (Exception $e) {// 這是可選的,如果您不想在生成過程中處理錯誤,則可以省略。 。 }
如果拋出異常,則您的作業系統不安全。
如果您使用的是 Windows,請確保啟用 mcrypt。
如果您使用任何其他作業系統,請確保/dev/urandom
可讀。
FreeBSD 監獄需要從主機作業系統公開/dev/urandom
如果您使用open_basedir
,請確保允許/dev/urandom
該庫不會(也不會接受任何補丁)回退到不安全的隨機數產生器。
如果您使用的項目在其composer.json中有這樣一行
"require" { ... "paragonie/random_compat": "~1.1", ... }
....然後您嘗試新增 random_compat 2 (或另一個明確需要 random_compat 2 的庫,例如這個安全的 PHP 加密庫),您將遇到版本衝突。
解決方案是讓專案更新其需求字串,以允許使用版本 2 及更高版本,而不是將使用者硬鎖定到版本 1。
「要求」 { ...- "paragonie/random_compat": "~1.1",+ "paragonie/random_compat": ">=1",... }
注意:有一個名為9.99.99
的特殊版本,它使該庫不執行任何操作,但只能安裝在 PHP 7 上。
如果您正在編寫支援 PHP 5 的軟體(例如程式庫),但可能被不支援 PHP 5 的軟體使用,則您需要允許安裝9.99.99
。上面的 diff 就是你想要的。
相反,如果您正在編寫(本身)支援 PHP 5 的軟體,則您不希望安裝 9.99.99,因此您需要進行以下更改:
「要求」 { ...- "paragonie/random_compat": "~1.1",+ "paragonie/random_compat": ">=1 <9.99",... }
為了避免安裝「空」版本9.99.99
您可以在根composer.json
中新增replace
部分:
"replace": { "paragonie/random_compat": "9.99.99" },
如果您使用 PHP Archive (Phar) 方法而不是 Composer,並且收到錯誤訊息,大意是“清單讀取長度為{int1}
應為{int2}
”,則 Phar 擴充功能可能未啟用。
有關如何解決此問題的具體指導,請參閱此評論。
如果沒有以下個人的貢獻,這個計畫就不會像今天這樣優秀:
@AndrewCarterUK(安德魯卡特)
@asgrim(詹姆斯·蒂特坎布)
@bcremer(本傑明·克里默)
@chriscct7(克里斯·克里斯托夫)
@CodesInChaos(克里斯蒂安·溫納萊因)
@ConnorVG(康納·帕克斯)
@cs278(克里斯史密斯)
@cweagans(卡梅倫·伊根斯)
@dd32(迪昂·赫爾斯)
@geggleto(格倫·埃格爾頓)
@glensc(Elan Ruusamäe)
@格雷厄姆坎貝爾(格雷厄姆坎貝爾)
@ircmaxell(安東尼·費拉拉)
@jdevalk(約斯特·德·瓦爾克)
@jedisct1(弗蘭克丹尼斯)
@juliangut(朱利安·古鐵雷斯)
@kelunik(尼克拉斯凱勒)
@lt(利)
@MasonM(梅森馬龍)
@menkaff(Mehran NikNafs)
@mmeyer2k(邁克爾·M)
@narfbg(安德烈·安德烈耶夫)
@nicolas-grekas(尼古拉斯·格雷卡斯)
@ocean90(多明尼克·席林)
@奧伊塔
@oucil(凱文法利)
@philios33(菲爾·尼科爾斯)
@redragonx(史蒂芬·查韋斯)
@relaxnow(鮑克瑪男孩)
@rchouinard(瑞安·喬伊納德)
@rugk
@SammyK(薩米·凱·鮑爾斯)
@scottchiefbaker(斯科特貝克)
@skyosev(斯托揚·基奧舍夫)
@sthen(斯圖爾特·亨德森)
@stof(克里斯托夫·庫沃特)
@teohhanhui(張漢惠)
@tom--(湯姆·沃斯特)
@tsyr2ko
@trowski(亞倫·皮奧特羅斯基)
@twistor(克里斯·勒潘寧)
@vinkla(文森特·克萊伯)
@voku(拉爾斯·莫勒肯)
@xabbuh(克里斯蒂安·弗洛特曼)
如果您的公司在其產品或服務中使用此程式庫,您可能有興趣從 Paragon Initiative Enterprises 購買支援合約。