Как правильно зашифровать данные с правильной аутентификацией, используя 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
Другие вопросы по тегам