Random 包生成加密安全的随机值

2024 年 4 月 15 日

随机套餐 由 Stephen Rees-Carter 开发,通过简单的 PHP 帮助程序包生成一系列不同格式的加密安全随机值。创建此包的原因如下:

我在安全审计期间(尤其是在较旧的代码库上)经常遇到的问题是不安全的随机性,通常是在需要安全性的地方。它通常使用某种形式 rand() ,经常注入内部 md5() 生成随机散列,结合 str_shuffle() 生成新密码,或用于制作一次性密码 (OTP) rand(100_000, 999_999)

问题是 rand() 不是加密安全的,也不是 mt_rand() , mt_srand() , str_shuffle() , array_rand() ,或 PHP 中可用的其他不安全函数。我们不能简单地声明这些方法不安全,然后放下麦克风,然后走开。相反,我们需要提供安全的替代方案 - 所以而不是简单地说“不要使用 rand() 这样”,我们可以说“这是一个您可以使用的安全方法”!

以下是您可以使用此随机包执行的操作的一些示例:

随机一次性密码(数字固定长度 OTP)

生成 $length 位数的随机数字一次性密码 (OTP):

$otp = Random::otp(int $length): string;

对于生成 SMS 或电子邮件验证码的 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;

字符串方法还为常见用例提供了很好的包装器:

// 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;

和更多

参观 官方包 GitHub 页面上的完整详细信息,还可以查看 公告帖


帖子 Random 包生成加密安全的随机值 首先出现在 Laravel 新闻

加入 Laravel 时事通讯 直接在您的收件箱中获取所有此类最新的 Laravel 文章。