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.phar
โดยการรันการติดตั้งบรรทัดคำสั่ง Composer ในรูทโปรเจ็กต์ของคุณ
เมื่อคุณรันสคริปต์การติดตั้งแล้ว คุณควรมีไฟล์ composer.phar
ในโปรเจ็กต์รูทของคุณ และคุณสามารถรันคำสั่งต่อไปนี้:
php composer.phar require "riimu/kit-securerandom:^1.3"
หลังจากติดตั้งไลบรารีนี้ผ่าน Composer คุณสามารถโหลดไลบรารีโดยรวมไฟล์ vendor/autoload.php
ที่สร้างโดย Composer ระหว่างการติดตั้ง
หากคุณคุ้นเคยกับวิธีใช้ 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()
ส่งคืนค่าทศนิยมแบบสุ่มระหว่าง 0 ถึง 1 ซึ่งมีความแม่นยำ 52 บิต ดังนั้นค่าที่ส่งคืนจึงน้อยกว่า 1 เสมอ เมื่อเปรียบเทียบกับ getFloat()
การกระจายค่าจะมีความสม่ำเสมอมากกว่า และไม่ขึ้นอยู่กับ PHP_INT_MAX
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 ทั่วไป และลักษณะการบล็อกจะทำให้ไม่เหมาะสมอย่างยิ่งสำหรับวัตถุประสงค์ดังกล่าว
มีเพียงไม่กี่กรณีเท่านั้นที่คุณควรอ่านจาก /dev/random
แทน โดยส่วนใหญ่แล้วหากคุณกังวลว่า /dev/urandom
ยังไม่ได้รับการเริ่มต้นอย่างถูกต้อง อย่างไรก็ตาม โดยทั่วไปจะไม่เกิดขึ้นกับเว็บแอปพลิเคชัน เนื่องจากมีแนวโน้มที่จะเกิดปัญหาเฉพาะเมื่อเริ่มต้นระบบเท่านั้น
หากคุณรู้ว่าคุณจำเป็นต้องอ่านจาก /dev/random
อย่างแน่นอน คุณสามารถตั้ง RandomReader
และ Mcrypt
เพื่อใช้เป็นแหล่งการสุ่มแทนโดยการตั้งค่าพารามิเตอร์ Constructor เป็นเท็จ และจัดเตรียมตัวสร้างเป็น SecureRandom
ในตัวสร้าง ตัวอย่างเช่น:
<?php
require ' vendor/autoload.php ' ;
$ generator = new Riimu Kit SecureRandom Generator RandomReader ( false );
$ rng = new Riimu Kit SecureRandom SecureRandom ( $ generator );
เมื่อสร้าง SecureRandom
มันจะพยายามใช้ตัวสร้างแบบสุ่มที่ปลอดภัยตัวใดตัวหนึ่งที่มีอยู่ ขึ้นอยู่กับว่าตัวไหนรองรับโดยแพลตฟอร์มปัจจุบัน มีแหล่งที่มาแบบสุ่มต่อไปนี้ และจะพยายามตามลำดับต่อไปนี้:
GeneratorInternal
ใช้ฟังก์ชันภายในที่มีอยู่ใน PHP 7.0GeneratorRandomReader
เพียงอ่านไบต์จากอุปกรณ์สุ่ม /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 Kalliomäki
ดูใบอนุญาตสำหรับข้อมูลใบอนุญาตและการคัดลอก