Как поменять ключ aes-256 после шифрования?

У меня есть веб-сайт, на котором пользователи отправляют свои личные данные, и я думаю о шифровании этих данных с помощью aes-256, и их пароль используется в качестве ключа для этого шифрования, а затем я сохраняю зашифрованные данные в базе данных mysql ...

Теперь, если пользователь меняет свой пароль, как мне изменить ключ зашифрованных данных?

Должен ли я собрать все данные из базы данных, затем расшифровать их данные старым ключом, а затем снова зашифровать их новым ключом?


person Michael harris    schedule 24.01.2012    source источник


Ответы (4)


Вам не нужно повторно шифровать все данные пользователя, когда они меняют свой пароль.

Сгенерировать секретный ключ для шифрования данных пользователя; назовите это «ключом шифрования содержимого». Получите ключ из пароля пользователя; назовите это «ключом шифрования». Зашифруйте «ключ шифрования содержимого» с помощью «ключа шифрования». Сохраните зашифрованный ключ вместе с солью и количеством итераций, используемых для получения ключа.

Если они изменят свой пароль, расшифруйте ключ шифрования контента с помощью старого пароля и повторно зашифруйте его с помощью ключа, полученного из нового пароля. Вам следует выбрать новую соль для нового пароля и убедиться, что вы сохранили ее вместе с новым зашифрованным ключом.

Поскольку ключ шифрования контента выбирается случайным образом из огромного пространства, вы можете безопасно использовать ECB в качестве режима шифрования при его шифровании.

Не следует просто хешировать пароль, даже если вы используете соль, даже если вы используете еще не нарушенный алгоритм. Вам нужно повторить операцию хеширования тысячи раз. Для этого (правильно) есть библиотеки на большинстве платформ. Используйте алгоритм получения ключа (PBKDF2, от PKCS # 5), чтобы создать секретный ключ из пароля.

Эта концепция соответствует проекту шифрования S / MIME на основе пароля.

person erickson    schedule 24.01.2012
comment
Где будет храниться зашифрованный ключ? В памяти на сервере приложений или в физическом хранилище на сервере базы данных? - person dimiguel; 14.06.2017
comment
@dimgl Хранится в надежном постоянном хранилище с резервными копиями. Определенно не в памяти. Если вам все равно, если контент безвозвратно уничтожен из-за отключения электроэнергии. - person erickson; 14.06.2017
comment
Как из-за того, что ключ шифрования контента выбирается случайным образом из огромного пространства, помогает решить проблемы с ECB? - person Freek; 13.02.2020
comment
@Freek Поскольку каждый открытый текст (ключ шифрования содержимого), используемый с конкретным ключом шифрования ключа, уникален, получающиеся зашифрованные тексты тоже. - person erickson; 13.02.2020
comment
См. Также вторую цитату из Прикладной криптографии здесь. - person erickson; 13.02.2020
comment
Ах, вы имели в виду шифрование шифрования контента, я прочитал шифрование данных с ключом шифрования контента при первом просмотре этого ответа. - person Freek; 13.02.2020

Во-первых, обычно не следует использовать пароль в качестве ключа AES. Может быть, что-то вроде криптографического хеша (не MD5) пароля + соль (в этом случае вы бы сохранили соль, но не хеш).

Одна вещь, которую вы можете сделать, - это зашифровать файлы каждого пользователя случайным ключом, а затем зашифровать этот ключ хешированным + солёным паролем. Если пользователь меняет пароли, вам нужно только повторно зашифровать ключ.

person Jarred    schedule 24.01.2012

Одна из возможностей, которую следует рассмотреть, отделяет ключ, используемый для шифрования данных, от ключа, используемого для получения доступа к данным. Если все сделано аккуратно, это позволяет пользователю изменять свой пароль так часто, как он пожелает, в то время как вы изменяете только одну запись в базе данных. Отдельно вы можете запланировать изменение ключа (ов) шифрования своих данных, когда вам это удобно.

Как это работает?

  • Вы шифруете данные D для пользователя U с помощью случайно сгенерированного ключа K U, D.
  • Вы шифруете ключ K U, D отдельным ключом K1 U, K, сгенерированным из случайной соли, S1 U (который вы сохраняете запись) и пароль пользователя P1 U (который вы можете или не можете отслеживать). Зашифрованный ключ - E1 U.
  • Вы храните S1 U и K1 U, K наготове, когда пользователь захочет получить доступ к своим данным.
  • Когда пользователь U хочет получить доступ к своим данным, он предоставляет вам свой пароль, P1 U, и вы просматриваете S1 U и регенерируете K1 U, K из этих данных и используйте это для дешифрования E1 U, давая вам еще раз K U, D, с помощью которых вы расшифруете их фактические данные.
  • Вы гарантируете, что сможете определить правильный пароль, чтобы не извергать бинарную чушь, если пользователи вводят неправильный пароль.

Преимущество такого уровня косвенности возникает, когда пользователь хочет изменить свой пароль. Если вы не используете аналогичный метод, вам придется получить и проверить старый пароль и новый пароль, расшифровать все данные с помощью старого пароля и повторно зашифровать все это с помощью нового пароля.

На уровне косвенного обращения вы по-прежнему запрашиваете у пользователя их старый пароль (P1 U) и новый пароль (P2 U) и проверяете их, но вам нужно только расшифровать E1 U, а затем повторно зашифровать его новым ключом K2 U, K, сгенерированным из новой соли S2 U и нового пароля P2 U. Вам вообще не нужно трогать зашифрованные данные.

При уровне косвенного обращения система S может также хранить вторую зашифрованную копию ключа данных K U, D, зашифрованную системным паролем. Если становится необходимым или желательным изменить ключ, используемый для шифрования данных, система может использовать для этого свою зашифрованную копию ключа. Он может вести запись о том, какой ключ последний раз был записан пользователем в свой ключ, поэтому, когда пользователь вернется, чтобы просмотреть данные, он может изменить сохраненный ключ K2 U, D, потому что в это время у него есть их пароль (в остальное время его нет).

Это небольшая вариация некоторых идей в "Криптографии в База данных: последний рубеж защиты »Кевина Кенана. Ключи Kn U, K являются примерами KEK, ключа шифрования ключа. Вы также можете прочитать в книге о ключевых семействах, которые помогут в управлении зашифрованными данными.

person Jonathan Leffler    schedule 24.01.2012

Это глупо.

AES использует 256-битный ключ, поэтому, когда вы говорите, что будете использовать их пароль для ключа, он не будет почти таким же длинным, как требуемый размер ключа.

person Dan Kanze    schedule 24.01.2012
comment
Я буду хешировать их пароль, чтобы получить 256 байт, а затем использовать его в шифровании. - person Michael harris; 24.01.2012