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

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

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


person Brandon O'Rourke    schedule 29.07.2009    source источник
comment
Вы действительно хешируете пароли или что-то более сложное? Из-за ошибки кодирования я нахожусь в аналогичной лодке, но исходный код эффективно хэширует 1 + имя пользователя + + пароль, что достаточно сложно, чтобы сделать радужные таблицы довольно невыполнимыми (особенно, поскольку имя входа не выбирается пользователем).   -  person Eamon Nerbonne    schedule 29.07.2009
comment
Я хешировал пароль прямо. Похоже, вы уже добавили соль. Ваш способ кажется хорошим, потому что в дополнение к соли одинаковые пароли не будут иметь одинаковый хеш, потому что вы добавляете имя для входа.   -  person Brandon O'Rourke    schedule 29.07.2009


Ответы (8)


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

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

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

Собственно вы можете увидеть в статье

hash = MD5 (MD5 (password) . salt)

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

person Spencer Ruport    schedule 29.07.2009
comment
Интересная идея. Вы уверены, что это как-то не мешает безопасности? Тем более, что таким образом человек, получающий строки после второго хэша, будет иметь много информации о предыдущем шаге (например, постоянную длину), что может помочь ему найти соль. - person Sinan Taifour; 29.07.2009
comment
Соли - это не секрет. На самом деле вам нужно сохранять их (в виде обычного текста) вместе с каждым пользователем. - person Spencer Ruport; 29.07.2009
comment
Когда я прочитал ваше умное решение, я как раз писал ответ на этот вопрос, в котором говорилось, что вы не можете этого сделать. Хорошая работа +1 - person Graeme Perrow; 29.07.2009

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

person John Rasch    schedule 29.07.2009
comment
Это был бы мой подход. Рефакторинг определенно расширяет прошлый код и может - фактически, необходимо - также быть выполнен на уровне базы данных. - person Joseph Ferris; 29.07.2009
comment
Проблема в том, что он предполагает, что пользователь в конечном итоге войдет в систему, что может быть неправдой. Между тем их пароль гораздо более уязвим для атак. Если вы объедините это с тем фактом, что люди часто повторно используют имена пользователей и пароли ... вам следует использовать решение Спенсера. - person Flory; 30.07.2009
comment
Я думаю, что это очень небезопасно, так как это будет означать, что вы отправляете пароль в виде обычного текста на свой сервер. Вы должны отправить свой хешированный пароль на свой сервер, чтобы предотвратить атаки типа «злоумышленник в середине». - person Kolky; 13.06.2012

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

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

person Sinan Taifour    schedule 29.07.2009
comment
или укажите столбец как hash_type (nosalt, md5, sha1, sha512). Если это 'nosalt', сделайте одно, если это другое, там используется столбец соли, который хранится в другом месте в строке для использования при сравнении - с соответствующей хеш-функцией, когда вы приходите к нему обновляться (поскольку MD5 уже кажется слабее ). - person Alister Bulman; 30.07.2009

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

person Amish Programmer    schedule 03.02.2010

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

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

person nik    schedule 29.07.2009

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

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

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

person Cameron    schedule 29.07.2009

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

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

person NerdFury    schedule 29.07.2009

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

person D. M.    schedule 11.12.2009
comment
Разве не так полагается использовать соль? Чтобы быть уверенным, что я вас правильно понял, вы имеете в виду хэш (соль + пароль)? - person Gary; 20.06.2012