PHP: 暗号学的に強い乱数のバイト文字列を生成する

注釈

PHP7 から、 random_bytes() 関数が提供される。

概要:openssl_random_pseudo_bytes mcrypt_create_iv など

関数

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<?php

/// @return Returns the RandomBytes, or FALSE on error.
function random_bytes_fallback($length)
{
    if (function_exists('random_bytes')) {
        $bytes = random_bytes($length);
        if ($bytes !== false) {
            return $bytes;
        }
    }
    if (function_exists('openssl_random_pseudo_bytes')) {
        $crypto_strong = false;
        $bytes = openssl_random_pseudo_bytes($length, $crypto_strong); //< RAND_pseudo_bytes
        if ($bytes !== false && $crypto_strong) {
            return $bytes;
        }
    }
    if (function_exists('mcrypt_create_iv')) {
        return mcrypt_create_iv($length, MCRYPT_DEV_URANDOM); //< /dev/urandom
    }
    return false;
}

使い方

<?php

$bytes = random_bytes_fallback();
if ($bytes === false) {
    // 暗号学的なものをあきらめる
    $bytes = hash('sha512', uniqid(mt_rand(), true).'SaltOnDeadBeef', true);
}
// トークンとして使用する場合
$token = base64_encode($bytes);
// ハッシュ値として使用する場合
$hash = hash('sha1', $bytes);