Использовать SHA-512 и соль для хеширования хешированного пароля MD5?

Я работаю над системой, которая хеширует пароли пользователей с помощью MD5 (без соли). Я хочу более надежно хранить пароли, используя SHA-512 и соль.

Хотя это достаточно легко реализовать для будущих паролей, я хотел бы также модифицировать существующие хешированные пароли MD5, желательно, не заставляя всех пользователей менять свои пароли. Моя идея состоит в том, чтобы просто использовать SHA-512 и соответствующую соль для хеширования существующего хеша MD5. Затем я могу установить какой-нибудь флаг в базе данных, который указывает, какие пароли были хешированы из обычного текста, а какие - из хеша MD5. Или я мог бы просто попробовать оба при аутентификации пользователей. Или даже просто хешируйте новые пароли с помощью MD5, а затем SHA-512 / salt, чтобы их можно было обрабатывать так же, как и старые пароли.

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

Мой второй инстинкт состоит в том, что я действительно не понимаю, о чем говорю, поэтому мне лучше посоветоваться. Есть предположения?


person Jeremiah Orr    schedule 05.04.2012    source источник
comment
SHA-512 предлагает очень небольшое улучшение по сравнению с MD5 (например: MD5(salt + password) практически эквивалентно SHA512(salt + password)). Функции хеширования общего назначения, такие как MD5 и семейство SHA, не созданы для хранения паролей. Используйте bcrypt.   -  person NullUserException    schedule 31.10.2012
comment
Совершенно верно. На самом деле я намеревался сделать растяжку клавиш, но не уточнил это в своем вопросе. В итоге я использовал PBKDF2 вместо того, чтобы наивно реализовывать свой собственный алгоритм растягивания ключей.   -  person Jeremiah Orr    schedule 31.10.2012


Ответы (4)


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

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

person mensi    schedule 05.04.2012
comment
Это отличный ответ. Я реализовал именно этот тип решения раньше, и это отличный способ сделать это. - person ; 05.04.2012
comment
Спасибо за предложение о прозрачном перефразировании при входе пользователя в систему! Есть ли у вас какие-либо ссылки, объясняющие, почему применение хэша SHA-512 к хешированному значению MD5 менее безопасно, чем применение хеша SHA-512 к паролю в виде простого текста? Мне интересно узнать, почему ... - person Jeremiah Orr; 05.04.2012
comment
@JeremiahOrr: Для вашего конкретного приложения правильное использование достаточно продолжительной непредсказуемой соли даст гораздо больше с точки зрения безопасности, чем изменение схемы хеширования. Как объяснил j13r, применение SHA к MD5 не расширит пространство возможных хешей, поскольку они ограничены возможными результатами MD5. Кроме того, было бы еще лучше использовать одностороннюю функцию, специально оптимизированную для паролей, например PBKDF2 . - person mensi; 07.04.2012
comment
@JeremiahOrr: Рассмотрим этот преувеличенный пример. Предположим, я определяю хэш-функцию, которая отображает любой вход m в 0 или 1. Как вы можете себе представить, это не криптографически безопасная хеш-функция, так как выходное пространство очень мало. Теперь применение SHA-256 к выводу этой хеш-функции не помогает (вывод будет либо SHA (0), либо SHA (1)), потому что вывод хэша SHA-256 ограничен диапазоном вывода первого хэша. функция. - person Jared Ng; 07.04.2012
comment
@JaredNg Я очень сомневаюсь, что паролей больше, чем хешей MD5, даже учитывая каждый пароль, используемый каждым человеком на Земле. - person NullUserException; 31.10.2012
comment
@NullUserException По всей видимости, вы правы, но суть примера заключалась в том, чтобы продемонстрировать, что хеширование вывода хеш-функции не повышает безопасность. - person Jared Ng; 03.11.2012

Если вы сначала хешируете с помощью MD5, у вас будет только разброс MD5 (128 бит). Большая часть пространства SHA512 не будет покрыта вашими паролями. Значит, вы не пользуетесь преимуществом SHA512, но он не будет хуже MD5.

У вас есть преимущество в том, что если кто-то получает хэш SHA512 и не знает соли (это вы должны каким-то образом принудить), не может искать хеши и получать пароли - что было бы возможно с базой данных MD5, которая у вас есть. в настоящее время.

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

person j13r    schedule 05.04.2012
comment
but don't put the salt there - весь смысл соли в том, что ее не нужно хранить в секрете, и ее можно просто поместить в открытый текст рядом с хешированными значениями (у вас есть уникальный хеш для каждого пароля!). Также: хеширование пароля MD5 с помощью SHA-512 не причинит никакого вреда на основании каких-либо реальных фактов или простой интуиции? Потому что, как правило, последовательное применение нескольких хешей может принести больше вреда, чем пользы. - person Voo; 05.04.2012
comment
Суть хеш-функции в том, что она обеспечивает уникальное отображение между строкой переменного размера и числом из n бит. Любая хорошая хеш-функция избегает коллизий, и на самом деле чрезвычайно сложно произвести коллизии на SHA-512 и даже MD5 (если у вас нет произвольной длины, которой нет в паролях). Преобразование 128-битного значения в 512-битное пространство - тривиальная задача (у вас есть 2 ^ (512-128) неиспользуемых значений). Столкновения (а это вред) крайне маловероятны (вероятность 2 ^ (128-512)). - person j13r; 05.04.2012

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

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

Т.е. password_hash (все старые пароли, md5'd) и password_hash (md5 (новые пароли))

(Предупреждение: я не специалист по криптографии)

http://www.codinghorror.com/blog/2007/09/youre-probably-storing-passwords-incorrectly.html

person tangrs    schedule 05.04.2012
comment
О, я не собираюсь создавать свою собственную библиотеку хеширования, мне просто нужно знать, что делать с существующими паролями, хешируемыми MD5! - person Jeremiah Orr; 05.04.2012
comment
Я не специалист по криптографии, но я бы просто запустил функцию хеширования паролей для существующих паролей MD5. Для новых паролей вы сначала должны использовать старый алгоритм MD5, а затем передать его соответствующей функции хеширования паролей. Это или вы можете как-то отметить, использует ли пароль старый или новый алгоритм в базе данных (или где бы вы его ни хранили). - person tangrs; 05.04.2012
comment
@tangrs Его исходные пароли также хешированы MD5, они уже защищены. Он хочет перейти на SHA-512 с солью, что более безопасно. Зачем бы вы предложили ему двойное хеширование? Это все равно не решит вопрос о том, как отличить новый пароль от старого. А двойное хеширование - это безопасность через неясность, что так же хорошо, как и отсутствие защиты, потому что никто не знает, что, черт возьми, происходит и как это поддерживать. - person Churk; 05.04.2012
comment
Я имел в виду двойное хеширование как способ обратной совместимости. (Правда, кажется дешевым и ленивым) - person tangrs; 05.04.2012

Если вы посмотрите, как большинство сотрудников банка и людей с высокой степенью защиты меняют там пароль. Большинство из них в основном просят людей, использующих старый метод шифрования, создать новый пароль. Я думаю, что вы первым делом ставите отметку на всех существующих старых пользователях паролей MD5 и уведомляете их, что им нужно создать новый пароль и медленно перенести их в новую систему. Таким образом, когда вы устраняете проблемы с системой, если что-то пойдет не так, вы не будете спрашивать, новый это пользователь или старый. Мы двойное хеширование или одинарное? Никогда не следует сравнивать два хэша в качестве возможного ответа, потому что что, если MD5 ('abc') => 123, SHA ('NO') => 123, это означает, что кто-то мог ввести неправильный пароль, но все равно войдет.

person Churk    schedule 05.04.2012