Thư viện tiêu chuẩn PHP 7 cung cấp chức năng
md5[uniqid[$your_user_login, true]]
4 tạo ra các byte giả ngẫu nhiên bảo mật bằng mã hóa.Example:
$bytes = random_bytes[20];
var_dump[bin2hex[$bytes]];
Ví dụ trên sẽ xuất ra một cái gì đó tương tự như:
string[40] "5fe69c95ed70a9869d9f9af7d8400a6673bb9ce9"
Thông tin thêm: //php.net/manual/en/function.random-bytes.php
Php 5 [lỗi thời]
Tôi chỉ đang xem xét cách giải quyết vấn đề tương tự này, nhưng tôi cũng muốn chức năng của mình tạo ra một mã thông báo có thể được sử dụng để truy xuất mật khẩu. Điều này có nghĩa là tôi cần giới hạn khả năng của mã thông báo được đoán. Bởi vì
md5[uniqid[$your_user_login, true]]
5 dựa trên thời gian và theo php.net "giá trị trả về ít khác với microtime []", md5[uniqid[$your_user_login, true]]
5 không đáp ứng các tiêu chí. PHP khuyến nghị sử dụng md5[uniqid[$your_user_login, true]]
7 thay vào đó để tạo mã thông báo bảo mật bằng mã hóa.Một câu trả lời nhanh chóng, ngắn và đến điểm là:
bin2hex[openssl_random_pseudo_bytes[$bytes]]
sẽ tạo ra một chuỗi ngẫu nhiên các ký tự chữ và số có độ dài = $ byte * 2. Thật không may, điều này chỉ có bảng chữ cái là
md5[uniqid[$your_user_login, true]]
8, nhưng nó hoạt động.Dưới đây là chức năng mạnh nhất mà tôi có thể làm cho điều đó đáp ứng các tiêu chí [đây là phiên bản được triển khai của câu trả lời của Erik].
function crypto_rand_secure[$min, $max]
{
$range = $max - $min;
if [$range < 1] return $min; // not so random...
$log = ceil[log[$range, 2]];
$bytes = [int] [$log / 8] + 1; // length in bytes
$bits = [int] $log + 1; // length in bits
$filter = [int] [1 $range];
return $min + $rnd;
}
function getToken[$length]
{
$token = "";
$codeAlphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
$codeAlphabet.= "abcdefghijklmnopqrstuvwxyz";
$codeAlphabet.= "0123456789";
$max = strlen[$codeAlphabet]; // edited
for [$i=0; $i < $length; $i++] {
$token .= $codeAlphabet[crypto_rand_secure[0, $max-1]];
}
return $token;
}
md5[uniqid[$your_user_login, true]]
9 hoạt động như một sự sụt giảm trong thay thế cho