Нет, отменить хеш-функцию, такую как 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 (функция получения ключа на основе пароля). Такая функция определяет, как использовать salt вместе с хешем. Таким образом, идентичные хэши не будут генерироваться для идентичных паролей (от других пользователей или из других баз данных). По этой причине хэши паролей также не позволяют использовать радужные таблицы, если соль достаточно велика и правильно рандомизирована.
Хэши паролей также содержат рабочий коэффициент (иногда настраиваемый с использованием счетчика итераций ), который может значительно замедлить атаки, которые пытаются найти пароль с учетом значения соли и хеша. Это важно, так как база данных с солями и хэш-значениями может быть украдена. Наконец, хэш пароля также может быть hard-hard , так что для его вычисления требуется значительный объем памяти. Это делает невозможным использование специального оборудования (GPU, ASIC, FPGA и т. Д.), Чтобы злоумышленник мог ускорить поиск. Другие входные данные или параметры конфигурации, такие как перец или степень распараллеливания, также могут быть доступны для хэша пароля.
Однако он по-прежнему позволяет кому-либо проверять пароль, указанный H(X)
, даже если H(X)
является хэшем пароля. Хеши паролей все еще детерминированы, поэтому, если кто-либо знает все входные данные и сам алгоритм хеширования, тогда X
можно использовать для вычисления H(X)
и - опять же - результаты можно сравнивать.
Обычно используемые хэши паролей: bcrypt , scrypt и PBKDF2 . Существует также Argon2 в различных формах, который является победителем недавнего конкурса хэширования паролей. Здесь, на CrackStation - хорошее сообщение в блоге о правильной защите паролем.
Возможно, злоумышленники не смогут выполнить вычисление хэша, чтобы убедиться, что пароль правильный. Для этого перец может быть использован в качестве ввода хэша пароля. Альтернативно, значение хеш-функции, конечно, может быть зашифровано с использованием шифра, такого как AES, и режима работы, такого как CBC или GCM. Однако для этого требуется хранение секрета / ключа независимо и с более высокими требованиями к доступу, чем хэш пароля.