CoderTools

MD5 Генератор

Генерация MD5 хеш-значений для текста, полезно для проверки целостности данных

О MD5

MD5 (Message-Digest Algorithm 5) — широко используемая криптографическая хэш-функция, которая создаёт 128-битное (16-байтовое) хэш-значение, обычно представленное в виде 32-значного шестнадцатеричного числа. Разработан Рональдом Ривестом в 1991 году для замены более раннего алгоритма MD4 и был стандартизирован в RFC 1321 в апреле 1992 года.

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

<strong>Примечание по безопасности:</strong> MD5 не подходит для критически важных приложений, таких как хранение паролей, SSL-сертификаты или цифровые подписи, так как уязвим к атакам коллизий. Институт программной инженерии CMU считает MD5 «криптографически сломанным и непригодным для дальнейшего использования» с 2008 года.

История и алгоритм

MD5 был разработан профессором Рональдом Ривестом из MIT как более безопасная замена MD4. Алгоритм принимает входное сообщение произвольной длины и создаёт 128-битный «отпечаток» или «дайджест сообщения» в качестве вывода. Алгоритм MD5 разработан для быстрой работы на 32-битных машинах и не требует больших таблиц подстановки, что позволяет компактную реализацию.

Алгоритм обрабатывает сообщение переменной длины в вывод фиксированной длины 128 бит, разбивая входные данные на блоки по 512 бит. Он работает с 128-битным состоянием, разделённым на четыре 32-битных слова (A, B, C и D), и проходит через четыре раунда операций, при этом каждый раунд выполняет 16 операций на основе нелинейных функций, модульного сложения и битового вращения.

Псевдокод алгоритма

// Инициализация переменных
A = 0x67452301
B = 0xEFCDAB89
C = 0x98BADCFE
D = 0x10325476

// Подготовка функций
F(X,Y,Z) = (X AND Y) OR ((NOT X) AND Z)
G(X,Y,Z) = (X AND Z) OR (Y AND (NOT Z))
H(X,Y,Z) = X XOR Y XOR Z
I(X,Y,Z) = Y XOR (X OR (NOT Z))

// Обработка сообщения (сообщение должно быть кратно 512 битам)
// Дополнение сообщения до длины ≡ 448 (mod 512)
// Добавление 64-битного представления исходной длины сообщения

// Основной цикл
для каждого 512-битного блока дополненного сообщения:
    // Разбить блок на шестнадцать 32-битных слов (M[0..15])
    // Копировать состояние блока
    AA = A
    BB = B
    CC = C
    DD = D
    
    // Раунд 1
    для i от 0 до 15:
        A = B + ((A + F(B,C,D) + M[i] + T[i]) <<< s[i])
        Циклический сдвиг A, B, C, D
    
    // Раунд 2
    для i от 16 до 31:
        A = B + ((A + G(B,C,D) + M[(5*i + 1) mod 16] + T[i]) <<< s[i])
        Циклический сдвиг A, B, C, D
    
    // Раунд 3
    для i от 32 до 47:
        A = B + ((A + H(B,C,D) + M[(3*i + 5) mod 16] + T[i]) <<< s[i])
        Циклический сдвиг A, B, C, D
    
    // Раунд 4
    для i от 48 до 63:
        A = B + ((A + I(B,C,D) + M[(7*i) mod 16] + T[i]) <<< s[i])
        Циклический сдвиг A, B, C, D
    
    // Добавить результат обработки блока
    A = A + AA
    B = B + BB
    C = C + CC
    D = D + DD

// Вывод
MD5 = A || B || C || D // Объединено в 128-битный результат

Уязвимости безопасности

В 1996 году была обнаружена ошибка в дизайне MD5, хотя в то время она не считалась фатальной. К 2004 году были обнаружены более серьёзные уязвимости, и исследователи продемонстрировали практические атаки коллизий — методы создания пар различных входных данных, которые производят одинаковое значение хэша MD5.

В 2008 году группа исследователей использовала эти уязвимости для создания поддельного SSL-сертификата, который казался легитимным. Вредоносное ПО Flame использовало слабости MD5 для подделки цифровой подписи Microsoft в 2012 году. Современные атаки коллизий могут находить коллизии MD5 за секунды на стандартном компьютерном оборудовании.

Распространённые случаи использования

Примеры

Input: "Hello, World!"

MD5 Hash: 65a8e27d8879283831b664bd8b7f0ad4

Input: "" (empty string)

MD5 Hash: d41d8cd98f00b204e9800998ecf8427e

Ссылки и дополнительное чтение