Крипта — штука не про красивые слова, а про то, что у тебя либо шифр держит, либо дырка на проде. Документация по крипте обычно похожа на писанину из учебника: «Аутентифицированное шифрование с дополнительными данными обеспечивает целостность…». В реальности тебе нужно не читать мантры, а знать: что шифруешь, чем шифруешь и как потом это дерьмо расшифровать без фейлов.

AEGIS и GCM — это не магия, а алгоритмы. Sodium — просто обёртка, которая позволит тебе не писать велосипеды. Но обосраться можно даже с ней, если использовать «как есть».

Проверка: есть ли вообще Sodium?

php -m | grep sodium

Если sodium там нет — можешь сразу закрывать ноут. Без него дальше не поедешь. На PHP 7.2+ он встроен, но на серверах бывает цирк: собрали PHP без поддержки.

Минимальный пример

<?php

$plaintext = "Hello, World!";
$ad = "Additional Data"; // дополнительная аутентификация

$key = sodium_crypto_aead_aes256gcm_keygen();
$nonce = random_bytes(SODIUM_CRYPTO_AEAD_AES256GCM_NPUBBYTES);

// Шифрование $ciphertext = sodium_crypto_aead_aes256gcm_encrypt($plaintext, $ad, $nonce, $key);

// Дешифрование $decrypted = sodium_crypto_aead_aes256gcm_decrypt($ciphertext, $ad, $nonce, $key);

if ($decrypted === false) {
    throw new Exception("Расшифровка не удалась");
}

echo "Decrypted: " . $decrypted . PHP_EOL;

Где тебя ждут подлянки

  1. Nonce
    Это «несекретный параметр». Переводим с криптографического на человеческий: счётчик. Уникальный для каждого шифрования. Если будешь повторять nonce с тем же ключом — привет, криптоанализ и дырка в системе.
  2. Ключ
    Его нельзя хранить в коде. Генерить — да, но хранить в ENV или в KMS (Vault, AWS Secrets Manager, whatever). Кто хранит ключи в гите — тот враг самому себе.
  3. Associated Data (AD)
    Та самая дополнительная инфа. Тут часто кладут, например, ID пользователя или версию протокола. Фишка в том, что при дешифровании AD должен совпадать один в один. Не совпал — расшифровки не будет.
  4. Фейлы дешифровки
    false при расшифровке — это не баг, а сигнал «кто-то ковырнул данные». Игнорировать нельзя. Либо кидай Exception, либо рви процесс.
  5. Совместимость
    Sodium ≠ OpenSSL. Если ты думаешь, что зашифровал в одном и расшифруешь в другом — забудь.

Зачем это вообще нужно?

Шифровать куки, токены, файлы, личные данные. Всё, что не должно утечь наружу. Без аутентифицированного шифрования (типа AEGIS/GCM) ты получаешь красивую картинку, где данные «шифруются», но любой может подделать ciphertext, и ты этого даже не заметишь.

Итог

AEGIS через Sodium — нормальный инструмент, если пользоваться с головой. Но не думай, что он сам сделает систему безопасной.

  • Nonce не повторяй.
  • Ключи не храни в гите.
  • Ошибки не игнорируй.

А то потом будешь сидеть ночью и гадать, почему твой «Hello, World!» расшифровывается в «пшшшшгж».