paragonie/random_compat hiện có 8.2k sao trên GitHub, viết chủ yếu bằng PHP. PHP 5.x support for random_bytes() and random_int()
Tóm tắt dựng từ metadata GitHub của chính dự án — chưa có bài review TopGit. Trang sẽ tự động cập nhật khi bài review đầy đủ được xuất bản.
VÌ SAO CHƯA CÓ REVIEW
TopGit viết bài đầy đủ cho repo có nhiều sao nhất và được yêu cầu nhiều nhất. Trang này là snapshot trong thời gian chờ — xem README gốc ở tab READ ME.
PHP 5.x polyfill for random_bytes() and random_int() created and maintained
by Paragon Initiative Enterprises.
Although this library should function in earlier versions of PHP, we will only
consider issues relevant to supported PHP versions.
If you are using an unsupported version of PHP, please upgrade as soon as possible.
Important
Although this library has been examined by some security experts in the PHP
community, there will always be a chance that we overlooked something. Please
ask your favorite trusted hackers to hammer it for implementation errors and
bugs before even thinking about deploying it in production.
Do not use the master branch, use a stable release.
For the background of this library, please refer to our blog post on
Generating Random Integers and Strings in PHP.
Usability Notice
If PHP cannot safely generate random data, this library will throw an Exception.
It will never fall back to insecure random data. If this keeps happening, upgrade
to a newer version of PHP immediately.
Installing
With Composer:
# 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
Signed PHP Archive:
As of version 1.2.0, we also ship an ECDSA-signed PHP Archive with each stable
release on Github.
Download the .phar, .phar.pubkey, and .phar.pubkey.asc files.
(Recommended but not required) Verify the PGP signature of .phar.pubkey
(contained within the .asc file) using the PGP public key for Paragon Initiative Enterprises.
Extract both .phar and .phar.pubkey files to the same directory.
require_once "/path/to/random_compat.phar";
When a new version is released, you only need to replace the .phar file;
the .pubkey will not change (unless our signing key is ever compromised).
The entrypoint should be lib/random.php directly, not any of the other files in /lib.
Usage
This library exposes the CSPRNG functions added in PHP 7
for use in PHP 5 projects. Their behavior should be identical.
Generate a string of random bytes
try {
$string = random_bytes(32);
} catch (TypeError $e) {
// Well, it's an integer, so this IS unexpected.
die("An unexpected error has occurred");
} catch (Error $e) {
// This is also unexpected because 32 is a reasonable integer.
die("An unexpected error has occurred");
} catch (Exception $e) {
// If you get this message, the CSPRNG failed hard.
die("Could not generate a random string. Is our OS secure?");
}
var_dump(bin2hex($string));
// string(64) "5787c41ae124b3b9363b7825104f8bc8cf27c4c3036573e5f0d4a91ad2eeac6f"
Generate a random integer between two given integers (inclusive)
try {
$int = random_int(0, 255);
} catch (TypeError $e) {
// Well, it's an integer, so this IS unexpected.
die("An unexpected error has occurred");
} catch (Error $e) {
// This is also unexpected because 0 and 255 are both reasonable integers.
die("An unexpected error has occurred");
} catch (Exception $e) {
// If you get this message, the CSPRNG failed hard.
die("Could not generate a random int. Is our OS secure?");
}
var_dump($int);
// int(47)
Exception handling
When handling exceptions and errors you must account for differences between
PHP 5 and PHP7.
The differences:
Catching Error works, so long as it is caught before Exception.
Catching Exception has different behavior, without previously catching Error.
There is no portable way to catch all errors/exceptions.
Our recommendation
Always catch Error before Exception.
Example
try {
return random_int(1, $userInput);
} catch (TypeError $e) {
// This is okay, so long as `Error` is caught before `Exception`.
throw new Exception('Please enter a number!');
} catch (Error $e) {
// This is required, if you do not need to do anything just rethrow.
throw $e;
} catch (Exception $e) {
// This is optional and maybe omitted if you do not want to handle errors
// during generation.
throw new InternalServerErrorException(
'Oops, our server is bust and cannot generate any random data.',
500,
$e
);
}
Troubleshooting
Exception: "Could not gather sufficient random data"
If an Exception is thrown, then your operating system is not secure.
If you're on Windows, make sure you enable mcrypt.
If you're on any other OS, make sure /dev/urandom is readable.
FreeBSD jails need to expose /dev/urandom from the host OS
If you use open_basedir, make sure /dev/urandom is allowed
This library does not (and will not accept any patches to) fall back to
an insecure random number generator.
Version Conflict with [Other PHP Project]
If you're using a project that has a line like this in its composer.json
...and then you try to add random_compat 2 (or another library that explicitly
requires random_compat 2, such as this secure PHP encryption library),
you will get a version conflict.
The solution is to get the project to update its requirement string to allow
version 2 and above to be used instead of hard-locking users to version 1.
Note: There is a special version called 9.99.99 which makes this
library do nothing, but is only installable on PHP 7.
If you're writing software (e.g. a library) that supports PHP 5, but may
be used by software that doesn't, you'll want to allow 9.99.99 to be
installed. The above diff is what you want.
Conversely, if you're writing software that (in and of itself) supports
PHP 5, you do not want 9.99.99 to be installed, so you'll want to make
this change instead:
If you're using the PHP Archive (Phar) approach rather than Composer, and
you are getting an error message to the effect of "manifest read length
was {int1} should be {int2}", the Phar extension may not be enabled.
See this comment
for specific guidance on how to fix this issue.
Contributors
This project would not be anywhere near as excellent as it is today if it
weren't for the contributions of the following individuals:
@AndrewCarterUK (Andrew Carter)
@asgrim (James Titcumb)
@bcremer (Benjamin Cremer)
@chriscct7 (Chris Christoff)
@CodesInChaos (Christian Winnerlein)
@ConnorVG (Connor S. Parks)
@cs278 (Chris Smith)
@cweagans (Cameron Eagans)
@dd32 (Dion Hulse)
@geggleto (Glenn Eggleton)
@glensc (Elan Ruusamäe)
@GrahamCampbell (Graham Campbell)
@ircmaxell (Anthony Ferrara)
@jdevalk (Joost de Valk)
@jedisct1 (Frank Denis)
@juliangut (Julián Gutiérrez)
@kelunik (Niklas Keller)
@lt (Leigh)
@MasonM (Mason Malone)
@menkaff (Mehran NikNafs)
@mmeyer2k (Michael M)
@narfbg (Andrey Andreev)
@nicolas-grekas (Nicolas Grekas)
@ocean90 (Dominik Schilling)
@oittaa
@oucil (Kevin Farley)
@philios33 (Phil Nicholls)
@redragonx (Stephen Chavez)
@relaxnow (Boy Baukema)
@rchouinard (Ryan Chouinard)
@rugk
@SammyK (Sammy Kaye Powers)
@scottchiefbaker (Scott Baker)
@skyosev (Stoyan Kyosev)
@sthen (Stuart Henderseon)
@stof (Christophe Coevoet)
@teohhanhui (Teoh Han Hui)
@tom-- (Tom Worster)
@tsyr2ko
@trowski (Aaron Piotrowski)
@twistor (Chris Lepannen)
@vinkla (Vincent Klaiber)
@voku (Lars Moelleken)
@xabbuh (Christian Flothmann)
Support Contracts
If your company uses this library in their products or services, you may be
interested in purchasing a support contract from Paragon Initiative Enterprises.
Trang TopGit này là một snapshot — tab "Readme" hiển thị nguyên văn README của repo (đã bỏ link, giữ ảnh). Repo GitHub ở github.com/paragonie/random_compat là nguồn chính thức.
paragonie/random_compat có phải mã nguồn mở không?
Có — paragonie/random_compat phát hành theo license MIT, nghĩa là mã nguồn mở để đọc, fork và (tùy license) tái sử dụng. Mã: github.com/paragonie/random_compat.
paragonie/random_compat có trang demo không?
Dự án có trang chủ ở https://paragonie.com/projects. Tab "Readme" ở trang này thường có ảnh chụp và hướng dẫn bắt đầu nhanh.
paragonie/random_compat còn đang phát triển không?
Commit gần nhất trên paragonie/random_compat là 5 tháng trước (theo timestamp GitHub). Repo có 152 fork — một chỉ báo về mức độ quan tâm của cộng đồng.
paragonie/random_compat dùng license gì?
paragonie/random_compat phát hành theo license MIT. Nên mở file LICENSE trên GitHub để xác nhận — license metadata đôi khi lệch với thực tế dự án.
Đọc đầy đủ README ở tab phía trên.
Vẫn đang phân vân về random_compat?
Một cú bấm sẽ gửi câu hỏi kèm trang này cho AI — xem AI nói gì về random_compat.