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

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

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

Начать курс

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

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