Криптография: хэши, соль, шифрование, Data Protection API

↑ 7.4 Безопасность бэкенда · ← Предыдущая · → Следующая

Желательно~3 мин чтенияУровень: senior

Зачем это на собесе

Ждут различения хэширования, шифрования и подписи и знания, что «своё» крипто не пишут.

Объяснение

ПримитивНазначениеПример
Хэш (SHA-256/512)отпечаток данных, целостностьконтрольные суммы
Пароль-хэш (Argon2id, bcrypt, PBKDF2)хранение паролей: медленный, с сольюсм. Хранение паролей, ASP.NET Core Identity, API-ключи
HMACцелостность и аутентичность по общему ключуподпись вебхука
Симметричное шифрование (AES-GCM, ChaCha20-Poly1305)конфиденциальность + целостность (AEAD)шифрование полей БД
Асимметричное (RSA, ECC)обмен ключами, подписи, TLSJWT RS256/ES256
Подпись (ECDSA, Ed25519)неотказуемость, подлинностьподпись документов
KDF (HKDF, PBKDF2)получение ключей из секрета
CSPRNGслучайные ключи, токеныRandomNumberGenerator
// AES-GCM (AEAD): уникальный nonce на каждое шифрование
var nonce = RandomNumberGenerator.GetBytes(AesGcm.NonceByteSizes.MaxSize);
var cipher = new byte[data.Length]; var tag = new byte[AesGcm.TagByteSizes.MaxSize];
using var aes = new AesGcm(key, tag.Length);
aes.Encrypt(nonce, data, cipher, tag);
 
// Токены и ключи — только криптостойкий генератор
var token = Convert.ToHexString(RandomNumberGenerator.GetBytes(32));

Data Protection API (ASP.NET Core) — управляемое шифрование для cookie, антифорджери и своих данных: IDataProtector.Protect/Unprotect; кольцо ключей нужно хранить общим (Redis, БД, файловая система) для нескольких реплик и защищать.

Правила: не изобретайте алгоритмы; используйте проверенные библиотеки и AEAD; ключи храните отдельно от данных; TLS 1.2+ везде; не используйте MD5/SHA-1/DES/ECB.

Нюансы и подводные камни

  • Повтор nonce в AES-GCM с тем же ключом — катастрофа.
  • Random не подходит для секретов.
  • Шифрование без аутентификации (AES-CBC без MAC) уязвимо к подмене.
  • Сравнение MAC/токенов только за постоянное время (FixedTimeEquals).
  • Потеря ключа = потеря данных: планируйте резервирование и ротацию ключей.

Практика

  1. Зашифруйте поле в БД AES-GCM и реализуйте ротацию ключа.
  2. Настройте общее хранилище ключей Data Protection для нескольких реплик.
  3. Проверьте подпись вебхука через HMAC.

Вопросы с ответами

Связанные темы