Нет, отменить хеш-функцию, такую как MD5, невозможно: учитывая выходное хеш-значение невозможно найти входное сообщение, если не известно достаточно информации о входном сообщении.
Расшифровка не является функцией, которая определена для хэш-функции; шифрование и дешифрование являются функциями шифра, такого как AES в режиме CBC; хэш-функции не шифруют и не дешифруют . Хеш-функции используются для переваривания входного сообщения. Как следует из названия, обратного алгоритма по конструкции не существует .
MD5 был разработан как криптографически безопасная односторонняя хеш-функция. Теперь легко генерировать коллизии для MD5 - даже если большая часть входного сообщения предварительно определена. Таким образом, MD5 официально сломан, и MD5 больше не должен рассматриваться как криптографически безопасный хеш. Однако все еще невозможно найти входное сообщение, которое приводит к хеш-значению: найдите X, когда известен только H (X) (и у X нет предварительно вычисленной структуры с хотя бы одним 128-байтовым блоком предварительно вычисленных данных) , Нет никаких известных изображений до MD5.
Как правило, также можно угадывать пароли, используя атаки методом грубой силы или (расширенными) словарями, сравнивать базы данных или пытаться найти хэши паролей в так называемых радужных таблицах. Если совпадение найдено, то с вычислительной точки зрения, что входные данные были найдены. Хеш-функции также защищены от коллизионных атак: обнаружение X'
так, что H(X') = H(X)
дано H(X)
. Таким образом, если X
найдено, то с вычислительной точки зрения это действительно входное сообщение. В противном случае вы бы в конце концов осуществили атаку столкновением. Радужные таблицы могут быть использованы для ускорения атак, и существуют специальные интернет-ресурсы, которые помогут вам найти пароль с определенным хешем.
Конечно, возможно повторно использовать значение хешаH(X)
для проверки паролей, которые были сгенерированы в других системах. Единственное, что должна сделать принимающая система - это сохранить результат детерминированной функции, F
которая принимает в H(X)
качестве входных данных. Когда X
дается системе, то H(X)
и, следовательно, F
могут быть пересчитаны и результаты могут быть сопоставлены. Другими словами, не требуется расшифровывать значение хеша, чтобы просто проверить правильность пароля, и вы все равно можете сохранить хеш как другое значение.
Вместо MD5 важно использовать хэш пароля или PBKDF (функция получения ключа на основе пароля). Такая функция определяет, как использовать соль вместе с хешем. Таким образом, идентичные хэши не будут генерироваться для идентичных паролей (от других пользователей или из других баз данных). По этой причине хэши паролей также не позволяют использовать радужные таблицы, пока соль достаточно велика и правильно рандомизирована.
Хеши паролей также содержат рабочий фактор (иногда настраиваемый с использованием счетчика итераций ), который может значительно замедлить атаки, которые пытаются найти пароль с учетом значения соли и хеша. Это важно, так как база данных с солями и хэш-значениями может быть украдена. Наконец, хеш-пароль также может быть слишком жестким, поэтому для его вычисления требуется значительный объем памяти. Это делает невозможным использование специального оборудования (GPU, ASIC, FPGA и т. Д.), Чтобы злоумышленник мог ускорить поиск. Другие входные данные или параметры конфигурации, такие как перец или степень распараллеливания, также могут быть доступны для хэша пароля.
Тем не менее, он по-прежнему позволяет кому-либо проверять указанный пароль, H(X)
даже если H(X)
это хеш пароля. Хеши паролей по-прежнему детерминированы, поэтому, если кто-либо знает все входные данные и сам алгоритм хеширования, X
его можно использовать для вычисления H(X)
и, опять же, результаты можно сравнивать.
Обычно используются хэши паролей bcrypt , scrypt и PBKDF2 . Существует также Argon2 в различных формах, который является победителем недавнего конкурса хэширования паролей. Здесь, на CrackStation, есть хорошее сообщение в блоге о том , как правильно защитить пароль.
Возможно, злоумышленники не смогут выполнить вычисление хеша, чтобы убедиться, что пароль правильный. Для этого перец может быть использован в качестве ввода хеша пароля. Альтернативно, значение хеш-функции, конечно, может быть зашифровано с использованием шифра, такого как AES, и режима работы, такого как CBC или GCM. Однако это требует хранения секрета / ключа независимо и с более высокими требованиями к доступу, чем хэш пароля.