Криптография в PHP: шифрование и хеширование — полное руководство
В современной веб-разработке безопасность данных — один из ключевых приоритетов. PHP предоставляет мощные встроенные инструменты для криптографической защиты: от простого хеширования паролей до сложного асимметричного шифрования. В этой статье мы разберем основные подходы, библиотеки и лучшие практики работы с криптографией в PHP.
1. Хеширование данных
Хеширование — это необратимое преобразование данных в строку фиксированной длины. Оно используется для хранения паролей, проверки целостности файлов и создания цифровых подписей.
1.1. Хеширование паролей (password_hash)
Начиная с PHP 5.5, для хеширования паролей рекомендуется использовать функцию password_hash(). Она автоматически выбирает надежный алгоритм (по умолчанию bcrypt) и генерирует соль.
<?php
// Хеширование пароля
$password = 'MySecurePassword123!';
$hash = password_hash($password, PASSWORD_DEFAULT);
echo "Хеш: " . $hash . "\n";
// Проверка пароля
if (password_verify($password, $hash)) {
echo "Пароль верен!";
} else {
echo "Неверный пароль!";
}
?>
1.2. Хеширование с помощью hash()
Для других целей (например, контрольные суммы файлов) используйте функцию hash() с алгоритмами SHA-256, SHA-512 или BLAKE2.
<?php
$data = "Секретные данные";
$sha256_hash = hash('sha256', $data);
$blake2b_hash = hash('blake2b', $data);
echo "SHA-256: " . $sha256_hash . "\n";
echo "BLAKE2b: " . $blake2b_hash . "\n";
?>
2. Симметричное шифрование
Симметричное шифрование использует один и тот же ключ для шифрования и расшифровки данных. В PHP для этого используется расширение OpenSSL.
2.1. Шифрование с AES-256-GCM (аутентифицированное шифрование)
Рекомендуемый режим — AES-256-GCM, который обеспечивает конфиденциальность и проверку целостности.
<?php
$plaintext = "Конфиденциальное сообщение";
$key = random_bytes(32); // 256-битный ключ
$iv = random_bytes(12); // 96-битный вектор инициализации
// Шифрование
$ciphertext = openssl_encrypt(
$plaintext,
'aes-256-gcm',
$key,
OPENSSL_RAW_DATA,
$iv,
$tag
);
echo "Зашифрованные данные (base64): " . base64_encode($ciphertext) . "\n";
echo "Тег аутентификации: " . bin2hex($tag) . "\n";
// Расшифровка
$decrypted = openssl_decrypt(
$ciphertext,
'aes-256-gcm',
$key,
OPENSSL_RAW_DATA,
$iv,
$tag
);
echo "Расшифровано: " . $decrypted . "\n";
?>
2.2. Шифрование с AES-256-CBC (для совместимости)
Если требуется совместимость со старыми системами, используйте AES-256-CBC с HMAC для проверки целостности.
<?php
function encryptAesCbc($plaintext, $key) {
$iv = random_bytes(16);
$ciphertext = openssl_encrypt($plaintext, 'aes-256-cbc', $key, OPENSSL_RAW_DATA, $iv);
$hmac = hash_hmac('sha256', $iv . $ciphertext, $key, true);
return base64_encode($hmac . $iv . $ciphertext);
}
function decryptAesCbc($data, $key) {
$data = base64_decode($data);
$hmac = substr($data, 0, 32);
$iv = substr($data, 32, 16);
$ciphertext = substr($data, 48);
$expectedHmac = hash_hmac('sha256', $iv . $ciphertext, $key, true);
if (!hash_equals($hmac, $expectedHmac)) {
throw new Exception("Нарушена целостность данных!");
}
return openssl_decrypt($ciphertext, 'aes-256-cbc', $key, OPENSSL_RAW_DATA, $iv);
}
$key = random_bytes(32);
$encrypted = encryptAesCbc("Секретные данные", $key);
echo "Зашифровано: " . $encrypted . "\n";
echo "Расшифровано: " . decryptAesCbc($encrypted, $key) . "\n";
?>
3. Асимметричное шифрование
Асимметричное шифрование использует пару ключей: открытый (для шифрования
Также в библиотеке
Работа с изображениями в Java: от чтения до обработки
Spring WebFlux для Java: полное руководство с примерами
Валидация данных в Go (Golang): библиотеки, подходы и примеры кода
PDF генерация в Go: Обзор библиотек и практическое руководство
Логирование в JavaScript (Node.js): лучшие решения для вашего проекта