Openssl digest: примеры (PHP)
openssl_digest(string $data, string $digest_algo, bool $binary = false): string|falseФункция 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
<?
$hash = openssl_digest("Hello", "sha3-512");
echo $hash;
?>75d527c368f2efe848ecf6b073a367678... (длинный хеш)
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 или предварительно проверять список алгоритмов.
<?
// Передача строки вместо булева значения (до PHP 8)
$hash = openssl_digest("test", "md5", "true");
?>В PHP 8+ такое вызовет предупреждение о несоответствии типа, но может вернуть результат, интерпретировав строку как true. Лучше использовать строгие булевы значения.
<?
$bin = openssl_digest("test", "md5", true);
echo $bin; // Выведет "мусор" на экран, если бинарные данные содержат непечатные символы.
?>Для отображения бинарного хеша его нужно преобразовать, например, с помощью bin2hex() или base64_encode().
- PHP 8.0: Функция теперь возвращает значение типа
string|false. Ранее возвращалсяstring, а в случае ошибки мог вернутьсяfalseили пустая строка. Типизация стала строже. - PHP 7.4 и позднее: Добавлена поддержка новых алгоритмов, соответствующих современным стандартам OpenSSL, таких как семейство SHA-3 (sha3-224, sha3-256, sha3-384, sha3-512) и другие.
Хотя openssl_digest работает с готовой строкой, можно комбинировать её для хеширования потоков.
<?
// Имитация хеширования данных частями
$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...
<?
$fileContent = file_get_contents('example.txt');
$fileHash = openssl_digest($fileContent, 'sha512');
$expectedHash = 'abc123...';
if (hash_equals($fileHash, $expectedHash)) {
echo "Файл цел.";
} else {
echo "Файл изменен.";
}
?><?
$password = "мой_пароль";
$salt = "случайная_соль";
// Многократное хеширование для увеличения сложности (упрощенный KDF)
$key = openssl_digest($password . $salt, 'sha256', true);
$key = openssl_digest($key . $password . $salt, 'sha256', true);
echo "Ключ (hex): " . bin2hex($key);
?><?
$data = "seed";
$binaryHash = openssl_digest($data, 'sha1', true);
// Например, взять первые 8 байт для целочисленного значения
$intPart = unpack('J', substr($binaryHash, 0, 8))[1]; // J для 64-битного беззнакового (PHP 7.1+)
echo "Часть хеша как число: " . $intPart;
?>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
const crypto = require('crypto');
const hash = crypto.createHash('sha256').update('Hello').digest('hex');
console.log(hash);
// Для бинарного вывода: .digest() без аргумента возвращает Buffer185f8db32271fe25f561a6fc938b2e264306ec304eda518007d1764826381969
SELECT SHA2('Hello', 256); -- 256 означает алгоритм SHA-256185f8db32271fe25f561a6fc938b2e264306ec304eda518007d1764826381969
Основное отличие PHP-функции — необходимость явно указывать все параметры в одном вызове, тогда как в Python и JavaScript часто используется объектно-ориентированный подход с последовательным обновлением данных.