Openssl random pseudo bytes: примеры (PHP)

Использование openssl_random_pseudo_bytes для генерации безопасных данных
Раздел: Шифрование (OpenSSL)
openssl_random_pseudo_bytes(int $length, bool &$strong_result = null): string

Функция openssl_random_pseudo_bytes

Описание

Функция openssl_random_pseudo_bytes генерирует криптографически безопасную псевдослучайную строку байтов. Она используется в ситуациях, где требуется высокая энтропия, например для создания токенов, ключей шифрования, соли для хеширования паролей или значений nonce.

Аргументы
  • length (int): Обязательный параметр. Определяет длину генерируемой строки в байтах.
  • crypto_strong (bool &): Необязательный параметр, передаваемый по ссылке. Если передан, в него будет записано значение true, когда используется криптографически стойкий алгоритм генерации, и false в противном случае.

Простые примеры

Базовое использование
$bytes = openssl_random_pseudo_bytes(16);
echo bin2hex($bytes);
1a7f3d9c45b802e4f6c1d890a27b3e1d
С проверкой криптостойкости
$crypto_strong = false;
$bytes = openssl_random_pseudo_bytes(32, $crypto_strong);
echo 'Результат: ' . bin2hex($bytes) . '\n';
echo 'Криптостойкий: ' . ($crypto_strong ? 'да' : 'нет');
Результат: 4e2f8c1a9b7d5f3e0c2a6b8f1d4e7a3c5f0e2d1b8a9c7f6e5d4a3b2c1f0e9d8
Криптостойкий: да

Альтернативы в PHP

random_bytes

Функция random_bytes, доступная с PHP 7, является предпочтительной для генерации криптографически безопасных случайных строк. Она выбрасывает исключение при ошибке, что делает код надежнее.

Функции для не криптографических задач

Для случаев, не требующих криптографической стойкости (например, генерация идентификаторов для кеша), можно использовать uniqid в комбинации с mt_rand или random_int. random_int является криптографически безопасным аналогом rand и mt_rand.

Типичные ошибки

Передача некорректной длины

Указание нулевого или отрицательного значения длины вызывает ошибку.

$bytes = @openssl_random_pseudo_bytes(0);
if ($bytes === false) {
    echo 'Ошибка генерации.';
}
Ошибка генерации.
Неправильная интерпретация возвращаемого значения

Функция возвращает двоичную строку. Ее нельзя выводить напрямую или использовать как строку без преобразования.

$bytes = openssl_random_pseudo_bytes(5);
echo 'Длина строки: ' . strlen($bytes);
Длина строки: 5

Изменения в PHP

В PHP 8.0 не было внесено существенных изменений в поведение функции openssl_random_pseudo_bytes. Однако в целом, с версии PHP 7.0, рекомендуется использовать функцию random_bytes для подобных задач, так как она имеет более строгую семантику ошибок.

Расширенные примеры

Генерация безопасного токена
Пример php
function generateSecureToken($length = 32) {
    $bytes = openssl_random_pseudo_bytes($length, $strong);
    if ($bytes === false || $strong === false) {
        throw new RuntimeException('Не удалось сгенерировать криптостойкие байты.');
    }
    return bin2hex($bytes);
}
echo generateSecureToken();
f3a7b9e2d4c6a1f8b5e0d3c7a9b2f6e1d4c8a0b7f3e2d1c5
Создание соли для пароля
Пример php
$salt = bin2hex(openssl_random_pseudo_bytes(12));
$passwordHash = password_hash('user_password', PASSWORD_BCRYPT, ['salt' => $salt]);
echo $salt;
a3f8c1d4e7b0a9f2
Генерация вектора инициализации (IV) для шифрования
Пример php
$method = 'aes-256-cbc';
$ivLength = openssl_cipher_iv_length($method);
$iv = openssl_random_pseudo_bytes($ivLength);
echo 'IV (' . $ivLength . ' байт): ' . bin2hex($iv);
IV (16 байт): 1e4f8a3d7c0b9e2a5f6d1c8b3a0e7f4d2

Аналоги в других языках

Openssl random pseudo bytes в Python

Модуль secrets предоставляет функции для безопасной генерации. os.urandom() генерирует случайные байты.

import secrets
token_bytes = secrets.token_bytes(16)
print(token_bytes.hex())
a3f5d78e9c2b1a0f4e6d8c7b5a9f3e2d
JavaScript (Node.js)

Модуль crypto содержит метод randomBytes.

const crypto = require('crypto');
const bytes = crypto.randomBytes(16);
console.log(bytes.toString('hex'));
8f4a6d3b9c1e7f2a5d0b8e3c6a9f1d4e
MySQL

В SQL нет прямой аналогии для генерации байтов на стороне СУБД. Обычно такая генерация происходит на стороне приложения. Для случайных строк можно использовать RAND() и UUID(), но они не являются криптографически стойкими.

PHP openssl_random_pseudo_bytes function comments

En
Openssl random pseudo bytes Generate a pseudo-random string of bytes