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

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

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

Начать курс

Криптография в 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. Асимметричное шифрование

Асимметричное шифрование использует пару ключей: открытый (для шифрования

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