Random 包生成加密安全的随机值
最后更新于 作者 Eric L. Barnes
Stephen Rees-Carter 开发的 Random 包 通过一个简单的 PHP 辅助包,生成各种格式的加密安全的随机值。以下是创建此包的原因
我在安全审计中经常遇到的问题(尤其是在较旧的代码库中)是不安全的随机性,通常出现在需要安全性的位置。它通常使用某种形式的
rand()
,通常被注入md5()
中以生成随机哈希,并结合str_shuffle()
生成新密码,或者用于使用rand(100_000, 999_999)
生成一次性密码 (OTP)。
问题在于
rand()
不是加密安全的,mt_rand()
、mt_srand()
、str_shuffle()
、array_rand()
或 PHP 中其他不安全的函数也不安全。我们不能简单地宣布这些方法不安全,扔下麦克风就走开。相反,我们需要提供安全的替代方案 - 所以我们不能简单地说“不要以这种方式使用rand()
”,而是可以说“这里有一种你可以使用的安全方法!”
以下是使用 Random 包可以做的一些示例
随机一次性密码(数字固定长度 OTP)
生成一个 $length 位数字的随机数字一次性密码 (OTP)
$otp = Random::otp(int $length): string;
用于生成用于短信或电子邮件验证码的 OTP。
随机字符串
生成一个 $length 个字符的随机字符串,其中包含来自启用的字符类型的字符。默认情况下,它将随机选择字符,并且不保证存在任何特定字符类型。如果您需要包含每个字符中的一个,则可以设置 $requireAll = true。
// Primary method$string = Random::string( int $length = 32, bool $lower = true, bool $upper = true, bool $numbers = true, bool $symbols = true, bool $requireAll = false): string;
string 方法还附带了针对常见用例的友好包装器
// Random letters only$letters = Random::letters(int $length = 32): string; // Random alphanumeric (letters and numbers) token string$token = Random::token(int $length = 32): string; // Random letters, numbers, and symbols (i.e. a random password).$password = Random::password(int $length = 16, bool $requireAll = false): string; // Random alphanumeric token string with chunks separated by dashes, making it easy to read and type.$password = Random::dashed(int $length = 25, string $delimiter = '-', int $chunkLength = 5, bool $mixedCase = true): string;
混洗数组、字符串或集合
安全地混洗数组、字符串或 Laravel 集合,可以选择保留键。
$shuffled = Random::shuffle( array|string|\Illuminate\Support\Collection $values, bool $preserveKeys = false): array|string|\Illuminate\Support\Collection;