Шифрование / хеширование паролей в виде простого текста в базе данных - PullRequest
62 голосов
/ 13 ноября 2008

Я унаследовал веб-приложение, которое я только что обнаружил, хранит более 300 000 имен пользователей / паролей в виде простого текста в базе данных SQL Server. Я понимаю, что это очень плохая вещь.

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

Любая помощь приветствуется.

Редактировать: Извините, если мне неясно, я хотел спросить, какова будет ваша процедура шифрования / хеширования паролей, а не конкретные методы шифрования / хеширования.

Должен ли я просто:

  1. Сделать резервную копию БД
  2. Обновить логин / обновить пароль
  3. Через несколько часов просмотрите все записи в таблице пользователей, хэширующие пароль и заменяющие каждую
  4. Проверка того, что пользователи все еще могут входить / обновлять пароли

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

Ответы [ 16 ]

0 голосов
/ 22 апреля 2009

Я хотел бы предложить одно улучшение великолепного примера Python, опубликованного Orip . Я бы переопределил функцию random_bytes следующим образом:

def random_bytes(num_bytes):
    return os.urandom(num_bytes)

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

0 голосов
/ 14 ноября 2008

MD5 и SHA1 продемонстрировали небольшую слабость (два слова могут привести к одному и тому же хешу), поэтому рекомендуется использовать SHA256-SHA512 / итеративные хеши для хеширования пароля.

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

  1. Не использовать MD5 / SHA1
  2. Генерация хорошей случайной соли (во многих криптобиблиотеках есть генератор соли)
  3. Итеративный алгоритм хеширования, как рекомендуется orip
  4. Убедитесь, что пароли не передаются в виде простого текста по проводам
0 голосов
/ 13 ноября 2008

Я не эксперт по безопасности, но я полагаю, что в настоящее время рекомендуется использовать bcrypt / blowfish или вариант SHA-2, а не MD5 / SHA1.

Вероятно, вам также следует подумать о полном аудите безопасности

0 голосов
/ 13 ноября 2008

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

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

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

0 голосов
/ 13 ноября 2008

Для хеширования пароля вы можете использовать функцию HashBytes . Возвращает varbinary, поэтому вам нужно создать новый столбец, а затем удалить старый varchar.

Как

ALTER TABLE users ADD COLUMN hashedPassword varbinary(max);
ALTER TABLE users ADD COLUMN salt char(10);
--Generate random salts and update the column, after that
UPDATE users SET hashedPassword = HashBytes('SHA1',salt + '|' + password);

Затем вы модифицируете код для проверки пароля, используя запрос типа

SELECT count(*) from users WHERE hashedPassword = 
HashBytes('SHA1',salt + '|' + <password>)

, где - это значение, введенное пользователем.

0 голосов
/ 13 ноября 2008

хеш их с md5. это то, что обычно делается с паролями.

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