Криптография в PHP: шифрование и хеширование данных
Безопасность веб-приложений — одна из ключевых задач разработчика. PHP предоставляет мощные встроенные инструменты для криптографической защиты данных. В этой статье мы рассмотрим два основных направления: шифрование (преобразование данных с возможностью обратного восстановления) и хеширование (одностороннее преобразование для проверки целостности).
1. Хеширование в PHP
Хеширование используется для хранения паролей, контрольных сумм и проверки целостности данных. В PHP для этих целей применяются функции password_hash() и hash().
1.1. Безопасное хеширование паролей
Никогда не используйте md5 или sha1 для хранения паролей. Используйте алгоритм bcrypt через password_hash():
<?php
// Хеширование пароля
$password = 'MySecureP@ss123';
$hash = password_hash($password, PASSWORD_BCRYPT, ['cost' => 12]);
echo $hash; // $2y$12$...
// Проверка пароля
if (password_verify('MySecureP@ss123', $hash)) {
echo "Пароль верен!";
} else {
echo "Неверный пароль!";
}
?>
Функция password_hash() автоматически генерирует соль и использует безопасный алгоритм. Параметр cost регулирует вычислительную сложность (рекомендуется 10-12).
1.2. Хеширование произвольных данных
Для проверки целостности файлов или данных используйте алгоритмы SHA-256 или SHA-3:
<?php
$data = "Важные данные для проверки";
$hash_sha256 = hash('sha256', $data);
$hash_sha3_256 = hash('sha3-256', $data);
echo "SHA-256: " . $hash_sha256 . PHP_EOL;
echo "SHA3-256: " . $hash_sha3_256 . PHP_EOL;
// Проверка целостности файла
$file_hash = hash_file('sha256', '/path/to/file.zip');
echo "Хеш файла: " . $file_hash;
?>
2. Симметричное шифрование в PHP
Симметричное шифрование использует один ключ для зашифровки и расшифровки данных. PHP поддерживает OpenSSL и Sodium.
2.1. Шифрование через OpenSSL (AES-256-GCM)
Рекомендуемый режим — AES-256-GCM, который обеспечивает аутентификацию данных:
<?php
$data = "Секретное сообщение";
$key = random_bytes(32); // 256-битный ключ
$iv = random_bytes(12); // 96-битный вектор инициализации
// Шифрование
$encrypted = openssl_encrypt(
$data,
'aes-256-gcm',
$key,
OPENSSL_RAW_DATA,
$iv,
$tag
);
// Расшифровка
$decrypted = openssl_decrypt(
$encrypted,
'aes-256-gcm',
$key,
OPENSSL_RAW_DATA,
$iv,
$tag
);
echo "Исходные данные: " . $data . PHP_EOL;
echo "Расшифрованные: " . $decrypted . PHP_EOL;
echo "Тег аутентификации: " . bin2hex($tag);
?>
Важно: храните $key и $iv (или их комбинацию) для расшифровки. Тег $tag проверяет целостность данных.
2.2. Шифрование через Sodium (libsodium)
Начиная с PHP 7.2, Sodium является частью ядра. Он проще и безопаснее:
<?php
$data = "Конфиденциальная информация";
$key = sodium_crypto_secretbox_keygen(); // Генерация ключа
$nonce = random_bytes(SODIUM_CRYPTO_SECRETBOX_NONCEBYTES);
// Шифрование
$ciphertext = sodium_crypto_secretbox($data, $nonce, $key);
// Расшифровка
$decrypted = sodium_crypto_secretbox_open($ciphertext, $nonce, $key);
echo "Зашифровано: " . base64_encode($ciphertext) . PHP_EOL;
echo "Расшифровано: " . $decrypted . PHP_EOL;
// Очистка памяти
sodium_memzero($key);
?>
3. Асимметричное шифрование (RSA)
Асимметричное шифрование использует пару ключей (открытый/закрытый). Применяется для безопасной передачи данных:
<?php
// Генерация ключей
$config = [
'private_key_bits' => 2048,
'private_key_type' => OPENSSL_KEYTYPE_RSA,