由 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 购买支持合同。