2009-10-07 5 views
20

Меня попросили внедрить некоторые изменения/обновления на сайт интрасети; сделайте это «будущим доказательством», как они его называют.Как обновить схему хранения паролей (изменить алгоритм хеширования)

Мы обнаружили, что пароли хэшируются с использованием алгоритма MD5. (система существует с 2001 года, поэтому она была адекватной вовремя).
Теперь мы хотели бы обновить алгоритм хэширования до более сильного (BCrypt-hash или SHA-256).

Очевидно, что мы не знаем открытый текст-пароли и создание нового пароля для пользователей системы является не вариант*).

Итак, мой вопрос:

Что является общепринятым способом изменить хэш-алгоритма, не имея доступа к открытым текстом пароли?
Лучшим решением будет решение, полностью «за кулисами».

*) мы попробовали; пытались убедить их, мы использовали аргумент «возраст пароля», пытались подкупить их кофе, пытались подкупить их пирогом и т. д. и т. д. Но это не не вариант.

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

Ну, по крайней мере теперь я теперь нет другого решения.

ответ

24

Сначала добавьте поле в БД, чтобы определить, использует ли пароль MD5 или новый алгоритм.

Для всех паролей по-прежнему с помощью MD5:

- В процессе входа в систему, где вы проверить введенную пользователя пароль: временно сохранить представленный пароль пользователя в памяти (не проблема безопасности здесь, как это уже в памяти где-то) и сделать обычный MD5-хэш & сравнить с сохраненным хэшем;

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

(Конечно, вы бы просто использовать новый алгоритм для новых пользователей/новых паролей.)

3

Добавить парольИзменить поле даты и времени в базу данных.

Все пароль установлен до дня X, проверить с помощью MD5

Все пароли, установленные после дня Х, проверить с помощью Bcrypt или любой другой.

+0

И измените пароль пользователя, когда он входит в систему с MD5 до BCrypt. – Dennis

3

Вы можете сохранить либо в самом хэш-поле (например, «MD5: d41d8cd98f00b204e9800998ecf8427e»), либо в другом столбце, какой алгоритм использовался для создания этого хэша. Затем вам нужно будет изменить процесс входа в систему, чтобы использовать правильный алгоритм при проверке пароля. Естественно, любые новые пароли будут хешированы с использованием нового алгоритма. Надеюсь, что пароли в конечном итоге истекают, и со временем все хеши MD5 будут постепенно отменены.

+1

У вас также может быть процесс входа в систему «обновить» пароль для нового алгоритма хэширования, если у вас есть доступ к открытому паролю в то время. – Craig

+1

D'oh! Конечно, вы можете, и вы должны. –

3

Поскольку вы не знаете пароль открытым текстом, может быть, вы должны создать поле, которое указывает версию (как Шифрование PasswordVersion bit default 0)

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

Надеюсь, вам не понадобится столба PasswordVersion больше, чем bit. =)

+0

«Надеюсь, вам не понадобится столбец PasswordVersion больше, чем бит» заставил меня улыбнуться (+1) – Jacco

+0

На самом деле, не делайте предположения, что на этот раз вы получили это право. Используйте 'byte' для вашего PasswordVersion. –

+1

Только 8 пытаются сделать все правильно? Сделайте это 'int', и вы получите достаточно места, чтобы сделать свою собственную ошибку ... =) –

3

Вы должны изменить пароль базы данных для хранения 3 пунктов:

  1. Идентификатор алгоритма.
  2. Случайная сольная строка, выбранная сервером при первом вычислении и хранении хэша пароля.
  3. Хэш конкатенации соли + пароль с использованием указанного алгоритма.

Конечно это только можно было бы хранить в одном текстовом поле с разделителем:

"SHA256: в этом-это соль: это-это-хэш-значение"

Теперь конвертировать вы существующие записи в значение с пустой солью и старого алгоритма

"MD5 :: это-это-The-старо-md5-хэш-без соли"

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

  1. Если база данных показывает, что они используют старый алгоритм, без соли, сначала убедитесь, пароль по-старому, проверив, что совпадение пароля MD5 совпадает с паролем. Если нет, отклоните логин.
  2. Если пароль был проверен, попросите сервер выбрать случайную строку солярия, вычислить хэш SHA256 с солью + пароль и заменить запись таблицы паролей на новую, специфицируя новый алгоритм, соль и хеш.
  3. Когда пользователь войдет в систему снова, вы увидите, что они используют новый алгоритм, поэтому вычислите хэш соля + пароль и убедитесь, что он соответствует сохраненному хешу.

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

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

+0

старая MD5-схема уже использовала правильное хеширование. – Jacco

+0

Я не уверен, что я понимаю ваш комментарий, если только «используемое правильное хеширование» означает, что вы уже добавили значение соли, прежде чем хэшировать пароль с помощью MD5. Если это так, схема обновления все еще работает, вам просто нужно принимать соль во время проверки с помощью MD5. –

5

Я не совсем уверен в этом, так как я не специалист по криптографии. Пожалуйста, поправьте меня, если я ошибаюсь в какой-то момент!

Думаю, что у Дэйва П. есть лучший вариант.

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

Проблема заключается, конечно, в том, что при проверке пароля необходимо пройти через как хешей. И вам придется сделать то же самое для нового пароля evey. Который, ну, в значительной степени глупый. Если вы не захотите использовать подобную схему, например, Дэйв П. объяснил, что в конце концов вернется обратно к одномашинным паролям с новым алгоритмом хеширования ... в этом случае, зачем вообще это беспокоиться? (Разумеется, вы можете использовать его в яркой «Улучшенной безопасности для всех паролей, применяемых немедленно!» - путь при представлении к корпоративным костюмам с относительно прямым лицом ...)

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

Но мальчик, о мальчик, это кто-то будет смеяться над этим кодом позже! :)

+0

Это похоже на то, что я искал. Но я не уверен в том, что «хеширование хэша» я думаю, что я где-то читал, что результаты могут быть неоптимальными в определенных условиях. Но я не знаю. – Jacco

+1

Это плохая идея, потому что если в первом хэше есть столкновение, то в объединенном алгоритме происходит столкновение. И есть известные столкновения в MD5. –

+2

@ Рихард, почему в этом контексте была бы проблема столкновения хэшей? –