Как правильно зашифровать данные с правильной аутентификацией, используя AES-256-CBC в php?
Я использую функцию openssl для шифрования данных с AES-256-CBC в php. Я был в состоянии зашифровать его, используя уникальный IV (путем генерации с openssl_random_pseudo_bytes) для каждого нового шифрования.
Но я борюсь с идеей аутентифицированного шифрования с помощью aes cbc. Как я в основном аутентифицируюсь, когда собираюсь расшифровать данные?
Нужно ли использовать что-то вроде PBKDF2, Blowfish или hash_hmac()?
Нужно ли как-то хешировать ключ?
Любая помощь очень ценится.
2 ответа
Но я борюсь с идеей аутентифицированного шифрования с помощью aes cbc. Как я в основном аутентифицируюсь, когда собираюсь расшифровать данные?
После того, как вы зашифруете данные случайным IV, поместите оба зашифрованного текста и IV в hash_hmac()
со вторым ключом.
Если вы спрашиваете, потому что вам нужно развернуть в производство, подождите, пока не выйдет версия 2 https://github.com/defuse/php-encryption, и используйте ее вместо этого. (Это AES-256-CTR, а не AES-256-CBC, но режим CTR имеет меньшую поверхность атаки, чем режим CBC; т. Е. Нет атак оракула-отступника, если вы победите HMAC.)
Не используйте RNCryptor.
RNCryptor написан / не был написан в соответствии со стандартами кодирования криптографии ни в PHP, ни в Python.
RNCryptor буквально нарушает правило 1 стандартов кодирования криптографии. Могут быть и другие проблемы, которые еще не были обнаружены. Если вы хотите переносимости между языками, используйте libsodium.
Простое решение, используйте RNCryptor, который доступен для php и многих других языков. Смотрите этот ReadMe для деталей реализации.
Даже если вы не используете RNCryptor, методы верны и безопасны.
Некоторые подробности с сайта:
- Шифрование AES-256
- Режим CBC
- Растяжение пароля с помощью PBKDF2
- Посол пароля
- Случайный IV
- Зашифровать то хэш HMAC
- Versioning