Криптография: хэши, соль, шифрование, Data Protection API
↑ 7.4 Безопасность бэкенда · ← Предыдущая · → Следующая
Зачем это на собесе
Ждут различения хэширования, шифрования и подписи и знания, что «своё» крипто не пишут.
Объяснение
| Примитив | Назначение | Пример |
|---|---|---|
| Хэш (SHA-256/512) | отпечаток данных, целостность | контрольные суммы |
| Пароль-хэш (Argon2id, bcrypt, PBKDF2) | хранение паролей: медленный, с солью | см. Хранение паролей, ASP.NET Core Identity, API-ключи |
| HMAC | целостность и аутентичность по общему ключу | подпись вебхука |
| Симметричное шифрование (AES-GCM, ChaCha20-Poly1305) | конфиденциальность + целостность (AEAD) | шифрование полей БД |
| Асимметричное (RSA, ECC) | обмен ключами, подписи, TLS | JWT 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). - Потеря ключа = потеря данных: планируйте резервирование и ротацию ключей.
Практика
- Зашифруйте поле в БД AES-GCM и реализуйте ротацию ключа.
- Настройте общее хранилище ключей Data Protection для нескольких реплик.
- Проверьте подпись вебхука через HMAC.
Вопросы с ответами
Хэширование или шифрование?
Хэш необратим и служит для проверки целостности/паролей; шифрование обратимо ключом и защищает конфиденциальность.
Зачем соль?
Делает хэши одинаковых паролей разными и не позволяет использовать радужные таблицы.