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

StackOverflow https://stackoverflow.com/questions/1201685

Вопрос

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

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

Это было полезно?

Решение

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

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

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

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

hash = MD5 (MD5 (password) . salt)

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

Другие советы

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

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

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

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

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

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

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top