Хранение пользователя и пароля в базе данных - PullRequest
10 голосов
/ 19 мая 2011

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

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

Вопрос в том, как сохранить эту комбинацию пользователь + пароль впотенциально небезопасная база данных?

Я не совсем понимаю, что мне показывать.

Допустим, я создаю расширенный ключ, подобный этому:

salt = random 32 characters string (is it okay?)
key = hash(usr password + salt)
for 1 to 65000 do
  key = hash(key + usr password + salt)

Должен ли я хранить[пользователь открытого текста], [расширенный ключ] и [соль] в базе данных?

Кроме того, что мне следует использовать для шифрования (с помощью AES или Blowfish) некоторых файлов, каждый раз используя новый пароль?Должен ли я генерировать новую соль и создавать новый расширенный ключ, используя (пароль, сохраненный в памяти программы + соль)?И в этом случае, если я храню зашифрованный файл в базе данных, я, вероятно, должен хранить только соль.База данных аналогична той, в которой я храню комбинацию пользователь + пароль.

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

Я использую Python с PyCrypto, но это не очень важно, общий пример просто отлично.Я прочитал несколько похожих вопросов, но они не очень ясны.

Большое спасибо!

Ответы [ 2 ]

10 голосов
/ 19 мая 2011

Крипто трудно понять, хорошо, что ты задаешь вопросы.

Хранение паролей: Пароли должны хэшироваться с использованием алгоритма растяжения ключа . Как правило, вы хотите использовать библиотеку, а не реализовывать ее самостоятельно. Ключевые алгоритмы растягивания разработаны для того, чтобы переживать циклы процессора, поэтому приятно оценивать их с помощью красивого C-кода. Если вы работаете в системе Linux с glibc, вы можете использовать модуль crypt.crypt (читай man crypt):

import crypt
encrypted = crypt.crypt(password, '$6$' + salt + '$')

Возвращает строку ASCII, которую вы можете безопасно сохранить в своей базе данных. ($6$ - это расширение glibc, использующее функцию растягивания ключа на основе SHA-512. Если у вас нет этого расширения, не используйте crypt.crypt). (Изменить: Алгоритм очень похож на тот, который вы задали в своем вопросе. Тем не менее, лучшая практика, как правило, состоит в том, чтобы позволить библиотеке делать это, а не бросать свои собственные.)

Шифрование файлов: Не делайте этого самостоятельно. Установите GnuPG (или scrypt, bcrypt, ncrypt, что у вас есть). Есть несколько вещей, которые могут легко пойти не так, когда вы создадите свой собственный способ шифрования файлов. Эти инструменты используют надлежащие функции вывода ключей, хеши аутентификации и режимы шифрования без какой-либо дополнительной настройки. Это не библиотеки Python, а исполняемые файлы, поэтому вам нужно написать оболочку, использующую модуль subprocess.

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

2 голосов
/ 19 мая 2011

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

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

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