Криптография в PHP: шифрование и хеширование (практическое руководство)

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

Криптография в 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                    

Рекомендаций