Действительно ли возможно дешифровать хеши MD5?

Ну, я думаю, что это может быть описано с помощью очень изобретенного примера. Скажем, у Вас есть метод в Java, который распечатывает все элементы в ArrayList:

void foo(ArrayList list)
{
    for(int i = 0; i < list.size(); ++i){
        System.out.println(list.get(i).toString());
    }
}

Теперь, если Вы называете тот метод как так: someObject.foo (ПУСТОЙ УКАЗАТЕЛЬ); Вы собираетесь, вероятно, получить NullPointerException, когда он пробует к списку доступа, в этом случае в вызове к list.size (); Теперь, Вы, вероятно, никогда не называли бы someObject.foo (ПУСТОЙ УКАЗАТЕЛЬ) с Нулевым значением как этот. Однако Вы, возможно, получили свой ArrayList из метода, который возвращает ПУСТОЙ УКАЗАТЕЛЬ, если он сталкивается с некоторой ошибкой при генерации ArrayList как someObject.foo (otherObject.getArrayList ());

, Конечно, у Вас также будут проблемы, если Вы сделаете что-то вроде этого:

ArrayList list = NULL;
list.size();

Теперь, в Objective C, у нас есть эквивалентный метод:

- (void)foo:(NSArray*)anArray
{
    int i;
    for(i = 0; i < [anArray count]; ++i){
        NSLog(@"%@", [[anArray objectAtIndex:i] stringValue];
    }
}

Теперь, если у нас есть следующий код:

[someObject foo:nil];

у нас есть та же ситуация, в которой Java произведет NullPointerException. К нулевому объекту получат доступ сначала в [anArray количество] Однако вместо того, чтобы бросить NullPointerException, Objective C просто возвратится 0 в соответствии с правилами выше, таким образом, цикл не будет работать. Однако, если мы устанавливаем цикл для выполнения количества раз набора, затем мы сначала отправляем сообщение в anArray в [anArray objectAtIndex:i]; Это также возвратится 0, но с тех пор objectAtIndex: возвращает указатель, и указателем на 0 является НОЛЬ/ПУСТОЙ УКАЗАТЕЛЬ, NSLog будет переданным нолем каждый раз через цикл. (Хотя NSLog является функцией и не методом, он распечатывает (пустой указатель), если передано ноль NSString.

В некоторых случаях более хорошо иметь NullPointerException, так как можно сказать сразу же, что что-то неправильно с программой, но если Вы не поймаете исключение, программа откажет. (В C, пытаясь разыменовать ПУСТОЙ УКАЗАТЕЛЬ таким образом заставляет программу отказывать.) В Objective C, это вместо этого правые дела возможно неправильное поведение во время выполнения. Однако, если у Вас есть метод, который не повреждается, если он возвращается, 0/nil/NULL/a обнулил структуру, затем это сохраняет Вас от необходимости проверить для проверки, объект или параметры являются нолем.

250
задан Maarten Bodewes 18 September 2018 в 10:45
поделиться

17 ответов

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

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

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

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

После того, как часть данных была обработана через хэш-функция, пути назад нет.

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

После того, как часть данных была обработана через хэш-функция, пути назад нет.

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

После того, как часть данных была обработана через хэш-функция, пути назад нет.

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

После того, как часть данных была обработана через хэш-функция, пути назад нет.

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

После того, как часть данных была обработана через хэш-функция, пути назад нет.

408
ответ дан 23 November 2019 в 02:55
поделиться

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

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

32
ответ дан 23 November 2019 в 02:55
поделиться

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

Вы не можете un-hash хеш MD5.

3
ответ дан 23 November 2019 в 02:55
поделиться

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

1
ответ дан 23 November 2019 в 02:55
поделиться

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

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

8
ответ дан 23 November 2019 в 02:55
поделиться

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

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

10
ответ дан 23 November 2019 в 02:55
поделиться

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

1
ответ дан 23 November 2019 в 02:55
поделиться

См. Все другие ответы здесь о том, как и почему это необратимо и почему вы все равно не хотели бы этого делать.

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

Также это не будет работать с солеными хэшами. Соление рекомендуется многими экспертами по безопасности.

6
ответ дан 23 November 2019 в 02:55
поделиться

There's no easy way to do it. This is kind of the point of hashing the password in the first place. :)

One thing you should be able to do is set a temporary password for them manually and send them that.

I hesitate to mention this because it's a bad idea (and it's not guaranteed to work anyway), but you could try looking up the hash in a rainbow table like milw0rm to see if you can recover the old password that way.

7
ответ дан 23 November 2019 в 02:55
поделиться

MD5 is a hashing algorithm, you can not revert the hash value.

You should add "change password feature", where the user gives another password, calculates the hash and store it as a new password.

7
ответ дан 23 November 2019 в 02:55
поделиться

Not possible, at least not in a reasonable amount of time.

The way this is often handled is a password "reset". That is, you give them a new (random) password and send them that in an email.

13
ответ дан 23 November 2019 в 02:55
поделиться

You can't revert a md5 password.(in any language)

But you can:

give to the user a new one.

check in some rainbow table to maybe retrieve the old one.

12
ответ дан 23 November 2019 в 02:55
поделиться

Technically, it's 'possible', but under very strict conditions (rainbow tables, brute forcing based on the very small possibility that a user's password is in that hash database).

But that doesn't mean it's

  • Viable
    or
  • Secure

You don't want to 'reverse' an MD5 hash. Using the methods outlined below, you'll never need to. 'Reversing' MD5 is actually considered malicious - a few websites offer the ability to 'crack' and bruteforce MD5 hashes - but all they are are massive databases containing dictionary words, previously submitted passwords and other words. There is a very small chance that it will have the MD5 hash you need reversed. And if you've salted the MD5 hash - this won't work either! :)


The way logins with MD5 hashing should work is:

During Registration:
User creates password -> Password is hashed using MD5 -> Hash stored in database

During Login:
User enters username and password -> (Username checked) Password is hashed using MD5 -> Hash is compared with stored hash in database

When 'Lost Password' is needed:

2 options:

  • User sent a random password to log in, then is bugged to change it on first login.

or

  • User is sent a link to change their password (with extra checking if you have a security question/etc) and then the new password is hashed and replaced with old password in database
53
ответ дан 23 November 2019 в 02:55
поделиться

You can't - in theory. The whole point of a hash is that it's one way only. This means that if someone manages to get the list of hashes, they still can't get your password. Additionally it means that even if someone uses the same password on multiple sites (yes, we all know we shouldn't, but...) anyone with access to the database of site A won't be able to use the user's password on site B.

The fact that MD5 is a hash also means it loses information. For any given MD5 hash, if you allow passwords of arbitrary length there could be multiple passwords which produce the same hash. For a good hash it would be computationally infeasible to find them beyond a pretty trivial maximum length, but it means there's no guarantee that if you find a password which has the target hash, it's definitely the original password. It's astronomically unlikely that you'd see two ASCII-only, reasonable-length passwords that have the same MD5 hash, but it's not impossible.

MD5 is a bad hash to use for passwords:

  • It's fast, which means if you have a "target" hash, it's cheap to try lots of passwords and see whether you can find one which hashes to that target. Salting doesn't help with that scenario, but it helps to make it more expensive to try to find a password matching any one of multiple hashes using different salts.
  • I believe it has known flaws which make it easier to find collisions, although finding collisions within printable text (rather than arbitrary binary data) would at least be harder.

I'm not a security expert, so won't make a concrete recommendation beyond "Don't roll your own authentication system." Find one from a reputable supplier, and use that. Both the design and implementation of security systems is a tricky business.

154
ответ дан 23 November 2019 в 02:55
поделиться

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

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

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

4
ответ дан 23 November 2019 в 02:55
поделиться

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

это единственный способ, не вдаваясь в криптоанализ.

2
ответ дан 23 November 2019 в 02:55
поделиться

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

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

  • если сообщение хэшируется с помощью SALT-сообщения
  • если сообщение хэшируется более одного раза

Например, вот один MD5-дешифратор онлайн-инструмент.

2
ответ дан 23 November 2019 в 02:55
поделиться
Другие вопросы по тегам:

Похожие вопросы: