Как бы вы добавили соль в существующие хеши паролей? - PullRequest
12 голосов
/ 29 июля 2009

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

Как бы вы перешли на новую систему хеширования?

Ответы [ 8 ]

31 голосов
/ 29 июля 2009

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

Соль пароля - это попытка защиты от радужных таблиц. В этом случае соль не должна быть секретом.

http://en.wikipedia.org/wiki/Rainbow_tables#Defense_against_rainbow_tables

Вы действительно можете увидеть в статье

hash = MD5 (MD5 (password) . salt)

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

14 голосов
/ 29 июля 2009

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

2 голосов
/ 29 июля 2009

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

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

1 голос
/ 03 февраля 2010

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

0 голосов
/ 12 декабря 2009

Лучший способ хранения соли - это вложение значения соли в хэш пароля + соль, которую я только что создал. Я не добавляю строку соли в начало или конец хеша, я буквально встраиваю соль в хеш.

0 голосов
/ 29 июля 2009

Если вы храните соль внутри хеша, выяснить, включена ли соль, достаточно просто, проверив длину хеша. Если соли нет, просто хешируйте пароль, если есть соль, хешируйте пароль + соль.

Вам не нужен логический столбец в вашей базе данных.

0 голосов
/ 29 июля 2009

Создайте новое поле в вашей базе данных с именем «salted» с типом true / false (или любым другим эквивалентом в вашей СУБД). Установите для всех значений значение false для существующих хэшей. Всякий раз, когда добавляется новый соленый хеш, установите для поля «соленый» значение true.

Затем все, что вам нужно сделать, это по-разному обрабатывать два типа хэшей в вашем коде.

Это скорее общее решение, чем конкретное, но оно должно решить вашу проблему.

0 голосов
/ 29 июля 2009

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

Конечно, лучшим способом было бы перейти на соленый хеш-стол.

...