由 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) {// 嗯,它是一个整数,所以这是意外的。die("发生了意外错误"); } catch (Error $e) {// 这也是意料之外的,因为 32 是一个合理的整数。die("发生了意外错误"); } catch (Exception $e) {// 如果收到此消息,则 CSPRNG 失败hard.die("无法生成随机字符串。我们的操作系统安全吗?"); }var_dump(bin2hex($string));// 字符串(64) "5787c41ae124b3b9363b7825104f8bc8cf27c4c3036573e5f0d4a91ad2eeac6f"
尝试 {$int = random_int(0, 255); } catch (TypeError $e) {// 嗯,它是一个整数,所以这是意外的。die("发生了意外错误"); } 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` 即可。 throw new Exception('请输入数字!'); } catch (Error $e) {// 这是必需的,如果你不需要做任何事情,只需 rethrow.throw $e; } catch (Exception $e) {// 这是可选的,如果您不想在生成过程中处理错误,则可以省略。 // throw new InternalServerErrorException('哎呀,我们的服务器崩溃了,无法生成任何随机数据。',500 ,$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 购买支持合同。