The 5th Annual China PHP Conference

random_bytes

(PHP 7)

random_bytesГенератор криптографически безопасных случайных байт

Описание

string random_bytes ( int $length )

Генерирует строку криптографически сильных случайных байт, заданной длины, которую можно использовать с подходящими криптографическими функциями, например для генерации SALT, ключей или инициализации векторов.

Источник случайных величин используемых данной функцией:

  • В Windows всегда используется » CryptGenRandom().
  • В Linux, если доступен, используется системный вызов » getrandom(2).
  • На других платформах используется /dev/urandom.
  • Если доступные источники случайных величин отсутствуют, то бросается исключение Exception.

Замечание: Эта функция была добавлена в PHP 7.0, а для версий с 5.2 по 5.2, существуют ее » пользовательские реализации.

Список параметров

length

Длина генерируемой строки в байтах.

Возвращаемые значения

Возвращает строку состоящую из заданного количества криптографически безопасных байт.

Ошибки

  • Если подходящие источники случайных величин отсутствуют, то бросается исключение Exception.
  • Если задан некорректный параметр, то бросается исключение TypeError.
  • Если будет задана некорректная длина length, то будет брошено исключение класса Error.

Примеры

Пример #1 Пример random_bytes()

<?php
$bytes 
random_bytes(5);
var_dump(bin2hex($bytes));
?>

Результатом выполнения данного примера будет что-то подобное:

string(10) "385e33f741"

Смотрите также

  • random_int() - Генератор криптографически безопасных случайных целых чисел
  • openssl_random_pseudo_bytes() - Generate a pseudo-random string of bytes
  • bin2hex() - Преобразует бинарные данные в шестнадцатеричное представление
add a note add a note

User Contributed Notes 1 note

up
11
akam at akameng dot com
1 year ago
I used below function to create random token, and also a salt from the token. I used it in my application to prevent CSRF attack.

<?php
function RandomToken($length = 32){
    if(!isset(
$length) || intval($length) <= 8 ){
     
$length = 32;
    }
    if (
function_exists('random_bytes')) {
        return
bin2hex(random_bytes($length));
    }
    if (
function_exists('mcrypt_create_iv')) {
        return
bin2hex(mcrypt_create_iv($length, MCRYPT_DEV_URANDOM));
    }
    if (
function_exists('openssl_random_pseudo_bytes')) {
        return
bin2hex(openssl_random_pseudo_bytes($length));
    }
}

function
Salt(){
    return
substr(strtr(base64_encode(hex2bin(RandomToken(32))), '+', '.'), 0, 44);
}

echo (
RandomToken());
echo
"\n";
echo
Salt();
echo
"\n";

/*
This function is same as above but its only used for debugging
*/
function RandomTokenDebug($length = 32){
    if(!isset(
$length) || intval($length) <= 8 ){
     
$length = 32;
    }
   
$randoms = array();
    if (
function_exists('random_bytes')) {
       
$randoms['random_bytes'] = bin2hex(random_bytes($length));
    }
    if (
function_exists('mcrypt_create_iv')) {
       
$randoms['mcrypt_create_iv'] = bin2hex(mcrypt_create_iv($length, MCRYPT_DEV_URANDOM));
    }
    if (
function_exists('openssl_random_pseudo_bytes')) {
       
$randoms['openssl_random_pseudo_bytes'] = bin2hex(openssl_random_pseudo_bytes($length));
    }
   
    return
$randoms;
}
echo
"\n";
print_r (RandomTokenDebug());

?>
To Top