Как бы вы добавили соль к существующим хэшам паролей?

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

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

Ответ 1

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

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

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

Фактически вы можете увидеть в статье

hash = MD5 (MD5 (password) . salt)

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

Ответ 2

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

Ответ 3

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

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

Ответ 4

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

Ответ 5

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

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

Ответ 6

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

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

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

Ответ 7

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

В вашей базе данных не обязательно использовать логический столбец.

Ответ 8

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