random_compat

2025-12-10 0 445

random_compat

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.

  1. Download the .phar, .phar.pubkey, and .phar.pubkey.asc files.
  2. (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.
  3. Extract both .phar and .phar.pubkey files to the same directory.
  4. require_once \"/path/to/random_compat.phar\";
  5. 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).

Manual Installation:

  1. Download a stable release.
  2. Extract the files into your project.
  3. require_once \"/path/to/random_compat/lib/random.php\";

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.

  1. If you\’re on Windows, make sure you enable mcrypt.
  2. 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

\"require\" {
    ...
    \"paragonie/random_compat\": \"~1.1\",
    ...
}

…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.

\"require\" {
    ...
-    \"paragonie/random_compat\": \"~1.1\",
+    \"paragonie/random_compat\": \">=1\",
    ...
}

Version 9.99.99

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:

\"require\" {
    ...
-    \"paragonie/random_compat\": \"~1.1\",
+    \"paragonie/random_compat\": \">=1 <9.99\",
    ...
}

To avoid installing \”empty\” version 9.99.99 you can add replace section
in your root composer.json:

\"replace\": {
    \"paragonie/random_compat\": \"9.99.99\"
},

Manifest Read Length Error

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.

下载源码

通过命令行克隆项目:

git clone https://github.com/paragonie/random_compat.git

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

申明:本文由第三方发布,内容仅代表作者观点,与本网站无关。对本文以及其中全部或者部分内容的真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。本网发布或转载文章出于传递更多信息之目的,并不意味着赞同其观点或证实其描述,也不代表本网对其真实性负责。

左子网 编程相关 random_compat https://www.zuozi.net/32978.html

roadrunner
上一篇: roadrunner
http kernel
下一篇: http kernel
常见问题
  • 1、自动:拍下后,点击(下载)链接即可下载;2、手动:拍下后,联系卖家发放即可或者联系官方找开发者发货。
查看详情
  • 1、源码默认交易周期:手动发货商品为1-3天,并且用户付款金额将会进入平台担保直到交易完成或者3-7天即可发放,如遇纠纷无限期延长收款金额直至纠纷解决或者退款!;
查看详情
  • 1、描述:源码描述(含标题)与实际源码不一致的(例:货不对板); 2、演示:有演示站时,与实际源码小于95%一致的(但描述中有”不保证完全一样、有变化的可能性”类似显著声明的除外); 3、发货:不发货可无理由退款; 4、安装:免费提供安装服务的源码但卖家不履行的; 5、收费:价格虚标,额外收取其他费用的(但描述中有显著声明或双方交易前有商定的除外); 6、其他:如质量方面的硬性常规问题BUG等。 注:经核实符合上述任一,均支持退款,但卖家予以积极解决问题则除外。
查看详情
  • 1、左子会对双方交易的过程及交易商品的快照进行永久存档,以确保交易的真实、有效、安全! 2、左子无法对如“永久包更新”、“永久技术支持”等类似交易之后的商家承诺做担保,请买家自行鉴别; 3、在源码同时有网站演示与图片演示,且站演与图演不一致时,默认按图演作为纠纷评判依据(特别声明或有商定除外); 4、在没有”无任何正当退款依据”的前提下,商品写有”一旦售出,概不支持退款”等类似的声明,视为无效声明; 5、在未拍下前,双方在QQ上所商定的交易内容,亦可成为纠纷评判依据(商定与描述冲突时,商定为准); 6、因聊天记录可作为纠纷评判依据,故双方联系时,只与对方在左子上所留的QQ、手机号沟通,以防对方不承认自我承诺。 7、虽然交易产生纠纷的几率很小,但一定要保留如聊天记录、手机短信等这样的重要信息,以防产生纠纷时便于左子介入快速处理。
查看详情

相关文章

猜你喜欢
发表评论
暂无评论
官方客服团队

为您解决烦忧 - 24小时在线 专业服务