Где хранить пароль? - PullRequest
       16

Где хранить пароль?

5 голосов
/ 10 апреля 2011

Я пишу приложение для управления паролями Android и хочу где-то хранить мастер-пароль, но не знаю где. Должен ли я зашифровать мастер-пароль, который дает мне пользователь, с помощью жестко заданного пароля, который я выберу, и затем сохранить его в базе данных? или я должен сделать что-то еще?

Ответы [ 2 ]

5 голосов
/ 10 апреля 2011

Никогда не следует хранить незашифрованные пароли.

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

Таким образом, вы можете сравнить пароль с хешем, когда пользователь дает вам пароль.Если он совпадает, вы можете расшифровать сохраненные пары user: password с заданным паролем.

PS: не забудьте засолить хеш и , пожалуйста, сделайте это правильно .

3 голосов
/ 19 декабря 2012

Нет, нет, тысячу раз нет.

Если вам разрешено просматривать код GPLv2, взгляните на исходный код KeePass.

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

Таким образом, процесс похож на это: 1. Отключите любой вид свопинга на диск, который вы можете отключить. Спросите у пользователя мастер-пароль.

  1. Превратите мастер-пароль в мастер-ключ шифрования только в памяти, используя что-то вроде PBKDF2 (HMAC-SHA-256, мастер-пароль, сохраненная случайная соль *, 2000000, 256) - PBKDF2 также известен как RFC2898 и PKCS # 5. HMAC-SHA-256 - это функция хеширования. Мастер-пароль - это то, что пользователь ввел - он никогда не сохраняется ни в какой форме! Хранимая случайная соль - это 64-разрядное или большее криптографически случайное значение, генерируемое заново каждый раз, когда выбирается новый мастер-пароль, и сохраняется вместо , сохраняя любую форму мастер-пароля вообще. 2000000 - это количество раз, которое мы собираемся запустить HMAC, который хранится и должен выбираться пользователем - это должно быть столько, сколько вы можете ждать (KeePass имеет функцию для их сравнения и определения, сколько времени занимает 1 секунда). - Я рекомендую увеличить это до 4 или 5 секунд). 256 - это количество требуемых выходных битов - в этом случае я предполагаю, что вы собираетесь использовать CAMELLIA-256 или AES-256 для шифрования ваших паролей (просто сопоставьте, сколько битов ваша функция шифрования использует для ключа) , Да, вместо этого можно использовать scrypt или bcrypt.

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

  3. Используйте главный ключ шифрования для расшифровки URL-адресов, имен пользователей, заметок и других данных, не связанных с паролем.

  4. Используйте мастер-ключ шифрования, чтобы расшифровать существующие пароли только по запросу пользователя (но только по точному паролю, запрошенному пользователем), а затем перезаписать данные случайным мусором, как только они это сделают, или таймером. заканчивается. Зашифруйте новые пароли, используя указанный главный ключ шифрования.

  5. Как только пользователь завершит работу или истечет таймер, перезапишите все переменные (особенно главный ключ шифрования только в памяти) со случайным мусором.

Примечание, которое вы храните:

  • Количество итераций
  • Соль
  • Зашифрованный «фиксированный» пароль, используемый исключительно для проверки правильности мастер-пароля
  • Зашифрованное имя пользователя, URL, заметки и т. Д.
  • Зашифрованные пароли отдельных сайтов

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...