Многие используют хеш-алгоритмы в своей работе, но зачастую совершенно не понимают почему его нельзя расшифровать. На самом деле, эта тема достаточно интересная.
К слову, bcrypt основан на симметричном шифровании, но при этом в качестве ключа используется функция, позволяющая получить значение, которое невозможно дешифровать что делает невозможным дешифровку самой фразы.
Но семейство блочных хеш алгоритмов таких как MD5, SHA1, SHA2 построенны без генераци ключей и симметричного шифрования. Здесь у нас основная хитрость заключается в многораундовости и блочности шифрования. Это может позвучать сложно, но на деле это похоже на игру в шахматы — дешифровка оригинала невозможна подобно тому, как число возможных расположений фигур на доске через несколько ходов назад становится все большим и большим и его уже невозможно быстро восстановить, кроме как путем полного перебора.
Если углубится немного внутрь, то на примере MD5 мы имеем следующий алгоритм:
- сообщение выравнивается до определенной нужной длины (добавляются нули).
- инициализируются 4 переменные (A, B, C, D) с определенными, константными значениями.
- режем сообщение блоками по 512 бит, в каждой итерации с помощью нескольких раундов и побитовых операций (xor, or, and, not) изменяем переменные A B C D. На каждом блоке переменные меняются и перезаписываются.
- результирующим хешем становится последовательно считанные A B C D в битовом формате. Для удобства, на выходе готовые функции зачастую возвращают 16-ричную строку а не массив байтов.
Как видно из беглого описания алоритма, переменные с каждым раундом/блоком модифицируются как положения фигур на доске, что приводит к невозможности дешифровать оригинальную «позицию».
Если определенные части статьи не понятны, милости прошу в комментарии.