Можно ли расшифровать хеши MD5? - PullRequest
240 голосов
/ 06 августа 2009

Кто-то сказал мне, что он видел программные системы, которые:

  1. восстановить зашифрованные пароли MD5 из других систем;
  2. расшифровать зашифрованные пароли и
  3. хранить пароли в базе данных системы, используя собственный алгоритм системы.

Это возможно? Я думал, что было невозможно / невозможно расшифровать хеши MD5.

Я знаю, что есть словари MD5, но есть ли алгоритм расшифровки?

Ответы [ 24 ]

395 голосов
/ 06 августа 2009

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

Подумайте об этом: MD5 всегда имеет длину 128 бит. Это означает, что существует 2 128 возможных хэшей MD5. Это достаточно большое число, и все же оно определенно конечно. И все же, существует бесконечное количество возможных входов для данной хеш-функции (и большинство из них содержат более 128 битов или всего лишь 16 байтов). Таким образом, на самом деле существует бесконечное количество возможностей для данных, которые бы хэшировали одно и то же значение. Что делает хеши интересными, так это то, что невероятно трудно найти два фрагмента данных, которые хэшируют с одинаковым значением, и вероятность того, что это произойдет случайно, почти равна 0.

Простой пример (очень небезопасной) хеш-функции (и это иллюстрирует общую идею ее одностороннего использования) состоит в том, чтобы взять все биты фрагмента данных и рассматривать их как большое число. Затем выполните целочисленное деление, используя большое (вероятно простое) число n и возьмите остаток (см .: Модуль ). Вам останется какое-то число от 0 до n . Если вам нужно будет выполнить те же вычисления еще раз (в любое время, на любом компьютере, в любом месте), используя точно такую ​​же строку, он получит то же значение. И все же, нет никакого способа выяснить, каково было первоначальное значение, поскольку существует бесконечное число чисел, которые имеют этот точный остаток, если их разделить на n .

Тем не менее было обнаружено, что у MD5 есть некоторые слабые стороны, такие, что при некоторой сложной математике можно найти коллизию, не пробуя 2 128 возможных входных строк. И тот факт, что большинство паролей короткие, и люди часто используют общие значения (например, «пароль» или «секретный»), означает, что в некоторых случаях вы можете достаточно разумно угадать чей-то пароль, прибегая к поиску хеша или используя Радужный стол . Это одна из причин, по которой вы всегда должны « salt » хэшировать пароли, чтобы два одинаковых значения при хешировании не хэшировали одно и то же значение.

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

154 голосов
/ 24 сентября 2009

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

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

MD5 - неправильный хеш для паролей:

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

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

53 голосов
/ 24 сентября 2009

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

Но это не значит, что это

  • 1012 * жизнеспособное * или
  • Secure

Вы не хотите «обращать» хеш MD5 . Используя методы, описанные ниже, вам никогда не понадобится. «Реверсивный» MD5 фактически считается злонамеренным - некоторые веб-сайты предлагают возможность «взламывать» и взламывать хеши MD5 - но все они представляют собой огромные базы данных, содержащие словарные слова, ранее введенные пароли и другие слова. Существует очень маленький шанс того, что у него будет хеш MD5, который вам нужен. И если вы солили хеш MD5 - это тоже не сработает! :)


Способ входа с хэшированием MD5 должен работать так:

Во время регистрации:
Пользователь создает пароль -> Пароль хэшируется с помощью MD5 -> Хэш хранится в базе данных

Во время входа в систему:
Пользователь вводит имя пользователя и пароль -> (Имя пользователя проверено). Пароль хэшируется с помощью MD5 -> Хэш сравнивается с сохраненным хэшем в базе данных

Когда требуется «Забыли пароль»:

2 варианта:

  • Пользователь отправил случайный пароль для входа в систему, а затем прослушивается, чтобы изменить его при первом входе в систему.

или

  • Пользователю отправляется ссылка для изменения его пароля (с дополнительной проверкой, если у вас есть секретный вопрос / и т. Д.), А затем новый пароль хэшируется и заменяется старым паролем в базе данных
32 голосов
/ 06 августа 2009

Не напрямую. Из-за принципа pigeonhole существует (вероятно) более одного значения, которое хэшируется для любого заданного выхода MD5. Таким образом, вы не можете изменить это с уверенностью. Более того, MD5 создан для того, чтобы затруднить поиск любого такого обратного хэша (однако были атаки, которые приводили к коллизиям - то есть, приводили к двум значениям, которые хэшируют с одинаковым результатом, но вы не можете контролировать, какое будет итоговое значение MD5).

Однако, если вы ограничите пространство поиска, например, обычными паролями с длиной меньше N, у вас может больше не быть свойства необратимости (поскольку число выводов MD5 намного больше, чем число строк в домене интерес). Тогда вы можете использовать радужный стол или аналогичный для обратных хешей.

13 голосов
/ 24 сентября 2009

Невозможно, по крайней мере, в разумные сроки.

Способ, которым это часто обрабатывается, - это «сброс» пароля. То есть вы даете им новый (случайный) пароль и отправляете его по электронной почте.

12 голосов
/ 24 сентября 2009

Вы не можете восстановить пароль md5. (На любом языке)

Но вы можете:

дать пользователю новый.

проверьте какой-нибудь радужный стол, чтобы получить старый.

9 голосов
/ 06 августа 2009

Нет, он, должно быть, запутался в словарях MD5.

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

8 голосов
/ 06 августа 2009

Дешифрование (прямое получение простого текста из хешированного значения алгоритмическим способом), нет.

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

7 голосов
/ 24 сентября 2009

Нет простого способа сделать это. Это своего рода точка хеширования пароля. :)

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

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

7 голосов
/ 24 сентября 2009

MD5 - алгоритм хэширования, вы не можете вернуть значение хеш-функции.

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

...