У меня есть база данных хешированных паролей, в которые перед хешированием не добавлялась соль. Я хочу добавить соли в новые пароли. Очевидно, я не могу повторно хешировать существующие.
Как бы вы перешли на новую систему хеширования?
У меня есть база данных хешированных паролей, в которые перед хешированием не добавлялась соль. Я хочу добавить соли в новые пароли. Очевидно, я не могу повторно хешировать существующие.
Как бы вы перешли на новую систему хеширования?
Что вы можете. Просто добавьте соль к существующему хешу и снова его. Конечно, это потребует, чтобы все будущие входы в систему проходили через один и тот же процесс, что означает, что нужно будет вызвать две хэш-функции, но многие законные шаблоны все равно делают это, поэтому это не пахнет так плохо, как вы могли подумать.
Создание пароля - это попытка защититься от радужных таблиц. В этом случае соль не должна быть секретом.
http://en.wikipedia.org/wiki/Rainbow_tables#Defense_against_rainbow_tables
Собственно вы можете увидеть в статье
hash = MD5 (MD5 (password) . salt)
Это тот же самый метод, который вы бы использовали. (За исключением другой функции хеширования.)
В качестве быстрого исправления вы можете создать столбец соли в базе данных, и когда пользователь входит в систему, правильно соответствующий старому хешу, вы можете затем использовать этот пароль, который он ввел с солью, и создать новый хеш.
Вы можете добавить столбец, состоящий из флага, показывающего, есть ли у пользователя старый (без соли) или новый (с солью) хеш.
На этом этапе неплохо было бы заставить всех пользователей изменить свои пароли при входе в систему. Таким образом, в конечном итоге вы можете избавиться от этого столбца.
Я имел дело с аналогичной проблемой, связанной с использованием нескольких методов хеширования. Я также использовал подход кодирования типа хеш-метода в базе данных (например, «альфа», «бета», «гамма», «дельта»). Я пометил все текущие хеши соответствующим уровнем. Когда пользователи входили в систему, я проверял их пароли и повторно хешировал их, используя обновленные методы. Срок действия наших паролей истекает через 90 дней, поэтому оставалось только продержаться 3 месяца, пока все пароли, использующие старые методы, не будут сброшены.
Здесь есть несколько способов, которые могут вам подойти .
Помните, что любой постоянный шаблон, который вы добавляете в существующий хэш, бесполезен (один из приемов по этой ссылке предлагает нечто подобное). Не должно быть идентифицируемого рисунка, который можно было бы использовать для выделения соли.
Конечно, лучше всего перейти на солёную хеш-таблицу.
Создайте новое поле в своей базе данных с именем «соленый» с типом истина / ложь (или любым другим эквивалентом в вашей СУБД). Установите все значения в false для существующих хэшей. Каждый раз, когда добавляется новый, соленый, хэш, установите для поля «salted» значение true.
Затем все, что вам нужно сделать, это по-разному обрабатывать два типа хэшей в вашем коде.
Это скорее общее решение, чем конкретное, но оно должно решить вашу проблему.
Если вы храните соль внутри хеша, должно быть довольно просто определить, включена ли соль, проверив длину хеша. Если соли нет, просто хешируйте пароль, если есть соль, хешируйте пароль + соль.
Вам не нужен логический столбец в вашей базе данных.
Лучший способ хранения соли - это встраивание ее значения в только что созданный хэш пароля + соль. Я не добавляю строку соли в начало или конец хеша, я буквально вставляю соль в хеш.