Криптография в PHP: шифрование и хеширование данных
В современной веб-разработке безопасность данных — это не опция, а обязательное требование. PHP предоставляет мощный арсенал инструментов для криптографической защиты, разделяющийся на два основных направления: шифрование (обратимое преобразование данных) и хеширование (необратимое преобразование). В этой статье мы рассмотрим ключевые библиотеки и функции PHP для обеих задач с практическими примерами.
1. Основные понятия криптографии в PHP
Прежде чем перейти к коду, важно различать два типа операций:
- Шифрование — преобразование данных с возможностью восстановления исходного текста при наличии ключа. Используется для передачи конфиденциальной информации.
- Хеширование — одностороннее преобразование, где восстановить исходные данные невозможно. Применяется для хранения паролей и проверки целостности.
PHP использует расширения openssl (для шифрования) и password_hash/hash (для хеширования).
2. Шифрование данных в PHP
2.1. Симметричное шифрование (AES)
Самый популярный алгоритм — AES-256-GCM, который обеспечивает высокую производительность и встроенную аутентификацию.
<?php
// Шифрование
$data = "Секретное сообщение";
$key = openssl_random_pseudo_bytes(32); // 256-битный ключ
$iv = openssl_random_pseudo_bytes(12); // 96-битный вектор для GCM
$encrypted = openssl_encrypt(
$data,
'aes-256-gcm',
$key,
OPENSSL_RAW_DATA,
$iv,
$tag
);
// Декодирование в base64 для передачи
$encrypted_base64 = base64_encode($iv . $tag . $encrypted);
// Дешифрование
$decoded = base64_decode($encrypted_base64);
$iv = substr($decoded, 0, 12);
$tag = substr($decoded, 12, 16);
$ciphertext = substr($decoded, 28);
$decrypted = openssl_decrypt(
$ciphertext,
'aes-256-gcm',
$key,
OPENSSL_RAW_DATA,
$iv,
$tag
);
echo "Расшифровано: " . $decrypted; // Секретное сообщение
?>
Важно: Никогда не используйте режим ECB — он небезопасен. Всегда используйте GCM или CBC с HMAC.
2.2. Асимметричное шифрование (RSA)
Для обмена ключами и цифровых подписей применяется RSA. PHP использует пару ключей (открытый/закрытый).
<?php
// Генерация ключей
$config = [
"private_key_bits" => 2048,
"private_key_type" => OPENSSL_KEYTYPE_RSA,
];
$res = openssl_pkey_new($config);
openssl_pkey_export($res, $privateKey);
$publicKey = openssl_pkey_get_details($res)['key'];
// Шифрование открытым ключом
$data = "Конфиденциальные данные";
openssl_public_encrypt($data, $encrypted, $publicKey);
// Дешифрование закрытым ключом
openssl_private_decrypt($encrypted, $decrypted, $privateKey);
echo $decrypted; // Конфиденциальные данные
?>
3. Хеширование паролей
Хеширование паролей — критически важная задача. PHP предоставляет специализированные функции, которые автоматически подбирают соль и стоимость вычислений.
3.1. bcrypt (рекомендуемый по умолчанию)
Функция password_hash() с алгоритмом PASSWORD_BCRYPT создаёт безопасный хеш с автоматической солью.
<?php
$password = "UserPassword123!";
// Хеширование
$hash = password_hash($password, PASSWORD_BCRYPT, ['cost' => 12]);
echo "Хеш: " . $hash . "\n"; // $2y$12$...
// Проверка
if (password_verify($password, $hash)) {
echo "Пароль верен!";
} else {
echo "Неверный пароль";
}
// Проверка необходимости перехеширования
if (password_needs_rehash($hash, PASSWORD_BCRYPT, ['cost' => 12])) {
$newHash = password_hash($password, PASSWORD_BCRYPT, ['cost' => 12]);
}
?>
3.2. Argon2 (современный стандарт)
Начиная с PHP 7.2 доступен алгоритм Argon2, который устойчив к атакам на GPU.
<?php
$password = "SecurePass456!";
// Хеширование Argon2i
$hash = password_hash($password