Có rất nhiều câu trả lời cho câu hỏi này, nhưng không ai trong số họ sử dụng Trình tạo số giả ngẫu nhiên an toàn bằng mật mã (CSPRNG).
Câu trả lời đơn giản, an toàn và chính xác là sử dụng RandomLib và không phát minh lại bánh xe.
Đối với những người khăng khăng phát minh ra giải pháp của riêng bạn, PHP 7.0.0 sẽ cung cấp random_int()
cho mục đích này; nếu bạn vẫn còn trên PHP 5.x, chúng tôi đã viết một polyfill PHP 5random_int()
để bạn có thể sử dụng API mới ngay cả trước khi bạn nâng cấp lên PHP 7.
Tạo an toàn các số nguyên ngẫu nhiên trong PHP không phải là một nhiệm vụ tầm thường. Bạn phải luôn luôn kiểm tra với các chuyên gia mật mã StackExchange thường trú trước khi bạn triển khai một thuật toán tự trồng trong sản xuất.
Với một trình tạo số nguyên an toàn tại chỗ, việc tạo một chuỗi ngẫu nhiên với CSPRNG là một cuộc dạo chơi trong công viên.
Tạo một chuỗi ngẫu nhiên, an toàn
/**
* Generate a random string, using a cryptographically secure
* pseudorandom number generator (random_int)
*
* This function uses type hints now (PHP 7+ only), but it was originally
* written for PHP 5 as well.
*
* For PHP 7, random_int is a PHP core function
* For PHP 5.x, depends on https://github.com/paragonie/random_compat
*
* @param int $length How many characters do we want?
* @param string $keyspace A string of all possible characters
* to select from
* @return string
*/
function random_str(
int $length = 64,
string $keyspace = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'
): string {
if ($length < 1) {
throw new \RangeException("Length must be a positive integer");
}
$pieces = [];
$max = mb_strlen($keyspace, '8bit') - 1;
for ($i = 0; $i < $length; ++$i) {
$pieces []= $keyspace[random_int(0, $max)];
}
return implode('', $pieces);
}
Cách sử dụng :
$a = random_str(32);
$b = random_str(8, 'abcdefghijklmnopqrstuvwxyz');
$c = random_str();
Bản trình diễn : https://3v4l.org/IMJGF (Bỏ qua các lỗi PHP 5; nó cần Random_compat)