Openssl digest: примеры (PHP)

Генерация дайджестов с openssl_digest: руководство и примеры
Раздел: Шифрование (OpenSSL)
openssl_digest(string $data, string $digest_algo, bool $binary = false): string|false
Функция openssl_digest

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

Синтаксис и аргументы

Синтаксис функции: openssl_digest(string $data, string $digest_algo, bool $binary = false): string|false.

  • $data (string): Исходные данные для хеширования.
  • $digest_algo (string): Метод хеширования. Список доступных алгоритмов можно получить с помощью openssl_get_md_methods(). Популярные: sha256, sha512, md5, sha1, sha3-256.
  • $binary (bool): Если true, функция возвращает сырые бинарные данные. Если false (по умолчанию), возвращается строка в шестнадцатеричном формате (hex).

Функция возвращает строку с хешем или false в случае ошибки (например, указан неизвестный алгоритм).

Краткие примеры использования
Базовое хеширование строки
<?
$data = "Секретные данные";
$hash = openssl_digest($data, 'sha256');
echo $hash;
?>
5f5c6a... (шестнадцатеричная строка)
Получение бинарного хеша
<?
$data = "Тест";
$binaryHash = openssl_digest($data, 'md5', true);
echo bin2hex($binaryHash);
?>
0cbc6611f5540bd0809a388dc95a615b
Использование SHA3-512
<?
$hash = openssl_digest("Hello", "sha3-512");
echo $hash;
?>
75d527c368f2efe848ecf6b073a367678... (длинный хеш)
Похожие функции в PHP

PHP предлагает несколько функций для хеширования:

  • hash(): Основная альтернатива из модуля Hash. Поддерживает широкий набор алгоритмов, часто имеет лучшую производительность для простого хеширования. hash('sha256', $data, $binary).
  • md5() и sha1(): Устаревшие специализированные функции. Их использование не рекомендуется для безопасности, но они могут быть быстрее для обратной совместимости.
  • hash_hmac(): Функция для создания хеш-кода с ключом (HMAC). openssl_digest сама по себе не поддерживает HMAC, для этого нужна отдельная функция.

Когда использовать openssl_digest: В основном, когда работа уже ведется с расширением OpenSSL для других операций (шифрование, подписи) или требуется алгоритм, специфичный для OpenSSL. Для большинства задач хеширования hash() предпочтительнее из-за скорости и простоты.

Типичные ошибки
Неверное имя алгоритма
<?
$result = openssl_digest("data", "unknown_algo");
var_dump($result);
?>
bool(false)

Ошибка возникает молча. Следует проверять результат на false или предварительно проверять список алгоритмов.

Неправильный тип данных для аргумента $binary
<?
// Передача строки вместо булева значения (до PHP 8)
$hash = openssl_digest("test", "md5", "true");
?>

В PHP 8+ такое вызовет предупреждение о несоответствии типа, но может вернуть результат, интерпретировав строку как true. Лучше использовать строгие булевы значения.

Ожидание строки hex при установленном $binary=true
<?
$bin = openssl_digest("test", "md5", true);
echo $bin; // Выведет "мусор" на экран, если бинарные данные содержат непечатные символы.
?>

Для отображения бинарного хеша его нужно преобразовать, например, с помощью bin2hex() или base64_encode().

Изменения в версиях PHP
  • PHP 8.0: Функция теперь возвращает значение типа string|false. Ранее возвращался string, а в случае ошибки мог вернуться false или пустая строка. Типизация стала строже.
  • PHP 7.4 и позднее: Добавлена поддержка новых алгоритмов, соответствующих современным стандартам OpenSSL, таких как семейство SHA-3 (sha3-224, sha3-256, sha3-384, sha3-512) и другие.
Расширенные примеры
Постепенное хеширование потока данных

Хотя openssl_digest работает с готовой строкой, можно комбинировать её для хеширования потоков.

Пример php
<?
// Имитация хеширования данных частями
$ctx = hash_init('sha256');
hash_update($ctx, "Часть1");
hash_update($ctx, "Часть2");
$finalHash = hash_final($ctx);
echo "Через hash(): " . $finalHash . "\n";
// С openssl_digest придется собрать строку:
$data = "Часть1" . "Часть2";
$opensslHash = openssl_digest($data, 'sha256');
echo "Через openssl_digest: " . $opensslHash;
?>
Через hash(): 9a6d... (одинаковый хеш для одинаковых данных)
Через openssl_digest: 9a6d...
Сравнение целостности файла
Пример php
<?
$fileContent = file_get_contents('example.txt');
$fileHash = openssl_digest($fileContent, 'sha512');
$expectedHash = 'abc123...';
if (hash_equals($fileHash, $expectedHash)) {
    echo "Файл цел.";
} else {
    echo "Файл изменен.";
}
?>
Создание ключа для шифрования на основе пароля (упрощенно)
Пример php
<?
$password = "мой_пароль";
$salt = "случайная_соль";
// Многократное хеширование для увеличения сложности (упрощенный KDF)
$key = openssl_digest($password . $salt, 'sha256', true);
$key = openssl_digest($key . $password . $salt, 'sha256', true);
echo "Ключ (hex): " . bin2hex($key);
?>
Использование с raw_output=true для дальнейшей обработки
Пример php
<?
$data = "seed";
$binaryHash = openssl_digest($data, 'sha1', true);
// Например, взять первые 8 байт для целочисленного значения
$intPart = unpack('J', substr($binaryHash, 0, 8))[1]; // J для 64-битного беззнакового (PHP 7.1+)
echo "Часть хеша как число: " . $intPart;
?>
Аналоги в других языках
Python (модуль hashlib)
import hashlib
data = b"Hello"
hash_obj = hashlib.sha256(data)
hex_dig = hash_obj.hexdigest()
print(hex_dig)  # Строка в hex
# Или для бинарного представления:
bin_dig = hash_obj.digest()
185f8db32271fe25f561a6fc938b2e264306ec304eda518007d1764826381969
JavaScript (Node.js, crypto)
const crypto = require('crypto');
const hash = crypto.createHash('sha256').update('Hello').digest('hex');
console.log(hash);
// Для бинарного вывода: .digest() без аргумента возвращает Buffer
185f8db32271fe25f561a6fc938b2e264306ec304eda518007d1764826381969
MySQL (функция SHA2)
SELECT SHA2('Hello', 256); -- 256 означает алгоритм SHA-256
185f8db32271fe25f561a6fc938b2e264306ec304eda518007d1764826381969

Основное отличие PHP-функции — необходимость явно указывать все параметры в одном вызове, тогда как в Python и JavaScript часто используется объектно-ориентированный подход с последовательным обновлением данных.

PHP openssl_digest function comments

En
Openssl digest Computes a digest