Как сохранить ключ шифрования?

#cryptography #password-encryption #password-manager

#криптография #пароль-шифрование #менеджер паролей

Вопрос:

Я просматриваю множество менеджеров паролей, таких как keeper, 1password, secret-in, и я слежу за менеджером паролей secret-in, чтобы создать свой собственный проект и пытаюсь добавить те же функции, но застрял на хранении данных пользователей, таких как его / ее секреты, секреты платежей в зашифрованном виде. Я прочитал здесь модель шифрования keeper, но все равно не понял. Где хранить ключ шифрования на стороне сервера? У меня есть некоторые данные, которые симметрично зашифрованы одним ключом в моей базе данных. Вместо того, чтобы жестко кодировать его в свой код, я ищу более безопасный способ хранения ключа шифрования. Где я могу безопасно хранить его?

Ответ №1:

Подход здесь довольно прост.

Вы отправляете зашифрованные данные только на сервер для хранения / резервного копирования. Полученные зашифрованные данные не поставляются с ключом.

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

Пользователи не умеют предоставлять высококачественные ключевые материалы, поэтому вместо этого требуйте от пользователя ввести пароль, возьмите этот пароль и передайте его через функцию получения ключа на основе хэша с параметрами, которые замедляют работу функции (высокая оперативность, высокие требования к памяти). Такого алгоритма, как pbkdf2 с сильным PRF, HMAC-SHA-2 должно быть достаточно.

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

  1. запрашивать пароль у пользователя при первом использовании
  2. запустите этот пароль через деривацию ключа, чтобы получить из него ключ: https://libsodium.gitbook.io/doc/key_derivation
  3. выполните шифрование пользовательских данных с помощью ключа: https://libsodium.gitbook.io/doc/secret-key_cryptography
  4. уничтожьте ключ и отправьте данные на сервер для резервного копирования

Комментарии:

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

2. @MayurKoli добавлено к ответу

3. Спасибо вам, сэр, за вашу поддержку, сэр, пожалуйста, проясните мое единственное сомнение: использую ли я библиотеку libsodium на стороне клиента (в javascript) для шифрования / дешифрования данных пользователя, а затем отправки данных на сервер.

4. да, именно @MayurKoli — это и есть шифрование на уровне устройства. Шифрование на стороне клиента на используемом устройстве.