#cryptography #password-encryption #password-manager
#криптография #пароль-шифрование #менеджер паролей
Вопрос:
Я просматриваю множество менеджеров паролей, таких как keeper, 1password, secret-in, и я слежу за менеджером паролей secret-in, чтобы создать свой собственный проект и пытаюсь добавить те же функции, но застрял на хранении данных пользователей, таких как его / ее секреты, секреты платежей в зашифрованном виде. Я прочитал здесь модель шифрования keeper, но все равно не понял. Где хранить ключ шифрования на стороне сервера? У меня есть некоторые данные, которые симметрично зашифрованы одним ключом в моей базе данных. Вместо того, чтобы жестко кодировать его в свой код, я ищу более безопасный способ хранения ключа шифрования. Где я могу безопасно хранить его?
Ответ №1:
Подход здесь довольно прост.
Вы отправляете зашифрованные данные только на сервер для хранения / резервного копирования. Полученные зашифрованные данные не поставляются с ключом.
Вам необходимо убедиться, что все шифрование и дешифрование происходит локально на устройстве пользователя. Таким образом, пользователю необходимо предоставить ключ.
Пользователи не умеют предоставлять высококачественные ключевые материалы, поэтому вместо этого требуйте от пользователя ввести пароль, возьмите этот пароль и передайте его через функцию получения ключа на основе хэша с параметрами, которые замедляют работу функции (высокая оперативность, высокие требования к памяти). Такого алгоритма, как pbkdf2
с сильным PRF, HMAC-SHA-2
должно быть достаточно.
Обновление: чтобы ответить на ваши конкретные вопросы, вам необходимо выполнить следующие шаги, вам нужно будет использовать криптографическую библиотеку, которая поддерживает вывод ключа из пароля и симметричное шифрование, например libsodium.
- запрашивать пароль у пользователя при первом использовании
- запустите этот пароль через деривацию ключа, чтобы получить из него ключ: https://libsodium.gitbook.io/doc/key_derivation
- выполните шифрование пользовательских данных с помощью ключа: https://libsodium.gitbook.io/doc/secret-key_cryptography
- уничтожьте ключ и отправьте данные на сервер для резервного копирования
Комментарии:
1. не могли бы вы рассказать мне, как шифрование и дешифрование происходит локально на устройстве пользователя , если возможно, пожалуйста, предоставьте некоторые учебные материалы, связанные с шифрованием на уровне устройства Спасибо.
2. @MayurKoli добавлено к ответу
3. Спасибо вам, сэр, за вашу поддержку, сэр, пожалуйста, проясните мое единственное сомнение: использую ли я библиотеку libsodium на стороне клиента (в javascript) для шифрования / дешифрования данных пользователя, а затем отправки данных на сервер.
4. да, именно @MayurKoli — это и есть шифрование на уровне устройства. Шифрование на стороне клиента на используемом устройстве.