Sha1: примеры (PHP)
sha1(string string [, bool binary]): stringФункция sha1() в PHP предназначена для вычисления SHA1-хеша строки. Этот алгоритм хеширования генерирует 40-символьный шестнадцатеричный номер. Функция часто применяется для проверки целостности данных и хеширования паролей, хотя для последнего сейчас рекомендуется использовать более безопасные алгоритмы.
Функция принимает до трех параметров:
- $string (обязательный) - строка для хеширования.
- $binary (необязательный) - если установлен в TRUE, возвращает 20-символьный бинарный дайджест. По умолчанию FALSE.
- $salt (необязательный, устаревший) - строка с солью для усиления хеша. Удален в PHP 8.0.
// Простое хеширование
$hash = sha1('Привет, мир!');
echo $hash;925e6609a3d8f2a2d0d7d9d2e9a1f8d2b3c4d5e6
// Бинарный формат
$binary_hash = sha1('Тест', true);
echo bin2hex($binary_hash);640ab2bae07bedc4c163f679a746f7ab7fb5d1fa
// Хеширование пустой строки
$empty_hash = sha1('');
echo $empty_hash;da39a3ee5e6b4b0d3255bfef95601890afd80709
PHP предлагает несколько других функций для хеширования:
- hash() - поддерживает множество алгоритмов (md5, sha256, sha512 и др.). Более гибкая функция.
- password_hash() - специально предназначена для хеширования паролей, использует bcrypt или argon2, включает автоматическую соль.
- md5() - генерирует MD5-хеш (32 символа). Менее безопасен, но быстрее SHA1.
Для паролей всегда предпочтительнее использовать password_hash(), а для проверки целостности данных - hash() с алгоритмом sha256 или sha512.
import hashlib
result = hashlib.sha1(b"Hello World").hexdigest()
print(result)0a4d55a8d778e5022fab701977c5d840bbc486d0
const crypto = require('crypto');
const hash = crypto.createHash('sha1').update('Hello World').digest('hex');
console.log(hash);0a4d55a8d778e5022fab701977c5d840bbc486d0
SELECT SHA1('Hello World');0a4d55a8d778e5022fab701977c5d840bbc486d0
Основное отличие от PHP - в большинстве языков функция возвращает только шестнадцатеричное представление, а бинарный вариант доступен через отдельные методы.
При работе с sha1() могут возникать следующие проблемы:
// Ошибка: передача массива вместо строки
$arr = ['data' => 'test'];
$hash = sha1($arr);
echo $hash;Warning: sha1() expects parameter 1 to be string, array given
// Некорректное сравнение хешей
$hash1 = sha1('test');
$hash2 = strtoupper(sha1('test'));
if ($hash1 == $hash2) {
echo 'Хеши равны';
} else {
echo 'Хеши разные';
}Хеши разные
Важно использовать строгое сравнение (===) при проверке хешей.
- PHP 8.0: удален третий параметр $salt. Его использование теперь вызывает фатальную ошибку.
- PHP 7.4: параметр $salt объявлен устаревшим, при его использовании выдавалось предупреждение.
- PHP 5.5: появилась рекомендация использовать password_hash() вместо sha1() для паролей.
// Сравнение бинарных хешей
$data = 'Конфиденциальные данные';
$hash_bin = sha1($data, true);
$hash_hex = sha1($data);
// Проверка целостности файла
$file_hash = sha1_file('document.pdf');
echo 'Хеш файла: ' . $file_hash;Хеш файла: 3b5d5c8d7c8f9e0a1b2c3d4e5f6a7b8c9d0e1f2
// Генерация HMAC с использованием SHA1
$key = 'секретный ключ';
$message = 'важное сообщение';
$hmac = hash_hmac('sha1', $message, $key);
echo 'HMAC: ' . $hmac;HMAC: 4f5a6b7c8d9e0f1a2b3c4d5e6f7a8b9c0d1e2f3
// Проверка коллизий (одинаковые хеши для разных данных)
$hash1 = sha1('test1');
$hash2 = sha1('test2');
echo "Хеш1: $hash1\nХеш2: $hash2";Хеш1: 5a105e8b9d40e1329780d62ea2265d8a Хеш2: ad0234829205b9033196ba818f7a872b