Ada banyak jawaban untuk pertanyaan ini, tetapi tidak satupun dari mereka yang memanfaatkan Pseudo-Random Number Generator (CSPRNG) Cryptographically Secure .
Jawaban sederhana, aman, dan benar adalah dengan menggunakan RandomLib dan jangan menemukan kembali kemudi.
Bagi Anda yang bersikeras menciptakan solusi Anda sendiri, PHP 7.0.0 akan menyediakan random_int()
untuk tujuan ini; jika Anda masih menggunakan PHP 5.x, kami menulis polyfill PHP 5 untukrandom_int()
sehingga Anda dapat menggunakan API baru bahkan sebelum Anda meningkatkan ke PHP 7.
Menghasilkan bilangan bulat acak dengan aman di PHP bukanlah tugas yang sepele. Anda harus selalu berkonsultasi dengan pakar kriptografi StackExchange tempat tinggal Anda sebelum menerapkan algoritme buatan sendiri dalam produksi.
Dengan generator integer yang aman, menghasilkan string acak dengan CSPRNG adalah jalan-jalan di taman.
Membuat String yang Aman dan Acak
/**
* 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);
}
Penggunaan :
$a = random_str(32);
$b = random_str(8, 'abcdefghijklmnopqrstuvwxyz');
$c = random_str();
Demo : https://3v4l.org/IMJGF (Abaikan kegagalan PHP 5; perlu random_compat)