SecureRandom是一個 PHP 函式庫,用於產生安全隨機數並將其用於常見的隨機化操作,例如打亂數組或產生密碼等字串序列。在 7.0 版本之前,PHP 沒有內建的安全隨機函數,但仍可以使用不同的隨機來源來產生安全隨機值。因此,這個庫有兩個主要目的:
該庫不提供任何額外的安全隨機位元組產生器。它只是使用 PHP 透過擴展或內部可用的位元組生成器。 PHP 常用的四種生成器是:
/dev/(u)random
讀取mcrypt_create_iv()
函數openssl_random_pseudo_bytes()
函數此庫產生的隨機性的安全性完全取決於底層隨機位元組產生器。除了產生隨機數均勻分佈所需的歸一化之外,該庫不會對位元組進行任何其他轉換。
API 文件位於:http://kit.riimu.net/api/securerandom/
OpenSSL
(使用 OpenSSQL 生成器)Mcrypt
(使用 Mcrypt 產生器)/dev/urandom
必須可讀才能使用隨機讀取器產生器安裝此程式庫的最簡單方法是使用 Composer 來處理依賴項。若要透過 Composer 安裝此程式庫,只需執行以下兩個步驟:
透過在專案根目錄中執行 Composer 命令列安裝來取得composer.phar
。
執行安裝腳本後,專案根目錄中應該有composer.phar
文件,並且可以執行以下命令:
php composer.phar require "riimu/kit-securerandom:^1.3"
透過 Composer 安裝此程式庫後,您可以透過包含 Composer 在安裝過程中產生的vendor/autoload.php
檔案來載入該程式庫。
如果您已經熟悉如何使用 Composer,您也可以透過將以下composer.json
檔案新增至您的專案並執行composer install
命令來將該程式庫新增為依賴項:
{
"require" : {
"riimu/kit-securerandom" : " ^1.3 "
}
}
如果您不想使用 Composer 載入庫,您也可以透過下載最新版本並將src
資料夾解壓縮到您的專案來手動下載庫。然後,您可以包含提供的src/autoload.php
檔案來載入庫類別。
該庫的使用非常簡單。只需建立SecureRandom
的實例並呼叫任意方法即可產生隨機值。例如:
<?php
require ' vendor/autoload.php ' ;
$ rng = new Riimu Kit SecureRandom SecureRandom ();
var_dump ( base64_encode ( $ rng -> getBytes ( 32 ))); // Returns a random byte string
var_dump ( $ rng -> getInteger ( 100 , 1000 )); // Returns a random integer between 100 and 1000
var_dump ( $ rng -> getFloat ()); // Returns a random float between 0 and 1
var_dump ( $ rng -> getRandom ()); // Returns a random float between 0 and 1 (not including 1)
var_dump ( $ rng -> getArray ( range ( 0 , 100 ), 5 )); // Returns 5 randomly selected elements from the array
var_dump ( $ rng -> choose ( range ( 0 , 100 ))); // Returns one randomly chosen value from the array
var_dump ( $ rng -> shuffle ( range ( 0 , 9 ))); // Returns the array in random order
var_dump ( $ rng -> getSequence ( ' 01 ' , 32 )); // Returns a random sequence of 0s and 1s with length of 32
var_dump ( $ rng -> getSequence ([ ' a ' , ' b ' , ' c ' ], 5 )); // Returns an array with 5 elements randomly chosen from 'a', 'b', and 'c'
var_dump ( $ rng -> getUuid ()); // Returns a random version UUID, e.g. '00056a74-036b-47c5-ab35-6f34a41a70ae'
SecureRandom
中提供以下方法來檢索隨機性:
getBytes($count)
傳回長度等於 $count 的隨機位元組字串。
getInteger($min, $max)
傳回兩個給定正整數(含)之間的隨機整數。
getFloat()
傳回 0 到 1(含)之間的隨機浮點數值。
getRandom()
getFloat()
回 0 PHP_INT_MAX
1 之間的隨機浮點值,精確度為 52 位,因此傳回值始終小於 1。
getArray(array $array, $count)
從給定陣列中傳回一些隨機元素。元素按隨機順序排列,但保留鍵。
choose(array $array)
傳回從陣列中選取的隨機值。
shuffle(array $array)
以隨機順序傳回陣列。密鑰被保留。
getSequence($choices, $length)
傳回值或字元的隨機序列。這些選項可以以字串或陣列的形式提供。傳回值的類型取決於選擇的類型。
getUuid()
傳回隨機版本 4 通用唯一識別碼。 UUID 是可以隨機、獨立產生的唯一標識符,且衝突的可能性非常小。 UUID 的範例可以是00056a74-036b-47c5-ab35-6f34a41a70ae
。
該庫提供的生成器預設使用/dev/urandom
作為隨機來源。從/dev/random
讀取資料不會為典型的 PHP Web 應用程式提供額外的安全性,其阻塞性質使其非常不適合此類目的。
只有少數合法情況下您應該從/dev/random
讀取。這主要是如果您擔心/dev/urandom
尚未正確播種。然而,Web 應用程式通常不會出現這種情況,因為這往往只在系統啟動時出現問題。
如果您知道絕對需要從/dev/random
讀取數據,則可以透過將建構函式參數設為 false 並在建構函式中向SecureRandom
提供產生器來設定RandomReader
和Mcrypt
以將其用作隨機來源。例如:
<?php
require ' vendor/autoload.php ' ;
$ generator = new Riimu Kit SecureRandom Generator RandomReader ( false );
$ rng = new Riimu Kit SecureRandom SecureRandom ( $ generator );
在創建SecureRandom
時,它將嘗試使用可用的安全隨機產生器之一,具體取決於當前平台支援哪一個。以下隨機來源可用,並將按以下順序嘗試:
GeneratorInternal
使用 PHP 7.0 中可用的內部函數GeneratorRandomReader
只是從隨機裝置/dev/urandom
讀取位元組GeneratorMcrypt
使用mcrypt_create_iv()
以MCRYPT_DEV_URANDOM
作為來源產生隨機位元組。GeneratorOpenSSL
使用openssl_random_pseudo_bytes()
產生隨機位元組。關於 OpenSSL 使用的演算法實際上在加密方面是否強大存在一些爭議。然而,由於缺乏具體的證據反對它,並且由於 PHP 手冊中對其強度的影響,該庫將默認使用 OpenSSL 作為最後的後備,以實現跨不同平台的更好兼容性。
如果您希望明確定義位元組產生器,可以將其作為SecureRandom
的建構函式參數提供。例如:
<?php
require ' vendor/autoload.php ' ;
$ rng = new Riimu Kit SecureRandom SecureRandom (
new Riimu Kit SecureRandom Generator Mcrypt ()
);
該庫版權所有 (c) 2014-2017 Riikka Kalliomaki。
有關許可證和複製信息,請參閱許可證。