С изобретением компьютеров наступил золотой век криптографии. Для тех, кто не знает, криптография — это искусство написания или решения скрытых кодов; что имеет смысл, поскольку греческое слово «скрытый» — криптос. Компьютеры значительно упростили шифрование сообщений до такой высокой степени, что это практически невозможно. К сожалению, компьютеры также упростили людям расшифровку сообщений. Поскольку шифрование выполняется с помощью ключа, и любой, кто знает ключ, может расшифровать сообщение, шифрование не является достаточно надежной защитой. Введите хэш-функции.

Хеш-функция — это любая функция, которую можно использовать для соединения данных разного размера с данными фиксированного размера. Значения, возвращаемые хеш-функцией, называются хеш-значениями, хэш-кодами, дайджестами или просто хэшами. Вот шаги, как работает хеш-функция с использованием хэш-функции SHA-1 (Secure Hash Algorithm), которая принимает строку любой длины и выводит 160-битное значение (40 шестнадцатеричных цифр).

Шаг 1. Введите в функцию хеширования произвольный ввод, например пароль. Давайте назовем себе пароль, Hunter2.

Шаг 2. Ввод преобразуется в ASCII (американский стандартный код для обмена информацией). ASCII — это стандарт кодирования символов для электронной связи. По сути, это таблица, в которой буквы, цифры и символы сопоставляются с числами, которые компьютеры могут прочитать и понять. Вот почему заглавные буквы так важны, потому что они получают свой собственный код ASCII. Таким образом, Hunter2 становится… 72 117 110 116 101 114 50

Шаг 3. Код превращается в бинарный. Итак, теперь наш вклад выглядит так ... 00110111 00110010 00100000 00110001 00110001 00110111 00100000 00110001 00110001 00110000 00100000 00110001 00110001 00110110 00100000 00110001 00110000 00110001 00100000 00110001 00110001 00110100 00100000 00110101 00110000

Шаг 4. SHA работает только с 512-битным сообщением, а Hunter2 — только с 56-битным. Поэтому, прежде чем что-либо произойдет, к нашему паролю будет добавлено достаточное количество битов для запуска функции. Это называется заполнение. Добавляемое заполнение будет одинаковым каждый раз для этого сообщения.

Шаг 5. Функция начинается с 5 переменных, каждая из которых содержит случайное 32-битное слово, например…

H0–01100111010001010010001100000001
H1–11101111110011011010101110001001
H2–10011000101110101101110011111110
H3–00010000001100100101010001110110
H4–11000011110100101110000111110000

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

Шаг 6. Наше сообщение побитно смешивается с переменными, в то время как переменные перемешиваются с помощью функции сжатия. Таким образом, функции хеширования, такие как SHA-1, построены на основе функций сжатия. В конце концов, наши 5 переменных будут выглядеть совершенно иначе. Это происходит каждый раз одинаково для одного и того же сообщения, поскольку алгоритм, используемый внутри функции, всегда один и тот же.

Шаг 7. Затем наши переменные преобразуются в шестнадцатеричный формат и объединяются вместе, чтобы дать нам дайджест пароля… A8A00ADEBF1411B8BAF07BDC688CE3889E8F7CB2.

В заключении

Хеш-функции очень сложны. Люди проводят всю свою жизнь, изучая их и другие виды способов скрыть или зашифровать сообщения. В последнее время SHA-1 и другие быстродействующие функции хеширования считаются устаревшими. Bcrypt и другие алгоритмы растяжения ключей считаются безопасными и должны использоваться. Это замедляет функции хеширования, поэтому злоумышленнику нужно тратить больше времени и денег на словарь или атаку грубой силы.