1.3. Приклади використання md5
Раніше вважалося, що MD5 дозволяє отримувати відносно надійний ідентифікатор для блоку даних. На даний момент ця хеш-функція не рекомендується до використання, так як існують способи знаходження колізій з прийнятною обчислювальною складністю.
Властивість унікальності хешу широко застосовується в різних областях. Варто відзначити, що наведені приклади відносяться і до інших криптографічним хеш-функцій.
За допомогою MD5 перевіряли цілісність і автентичність відбитку завантажених файлів - так, деякі програми поставляються разом зі значенням контрольної суми. Наприклад, пакети для інсталяції вільного ПЗ.
MD5 використовувався для хешування паролів. В системі UNIX кожен користувач має свій пароль і його знає тільки користувач. Для захисту паролів використовується хешування. Передбачалося, що отримати справжній пароль можна тільки повним перебором. При появі UNIX єдиним способом хешування був DES (Data Encryption Standard), але їм могли користуватися тільки мешканці США, тому що вихідні коди DES не можна було вивозити з країни. В FreeBSD вирішили цю проблему. Користувачі США могли використовувати бібліотеку DES, а решта користувачів мають метод, дозволений для експорту. Тому в FreeBSD стали використовувати MD5 за замовчуванням. Деякі Linux-системи також використовують MD5 для зберігання паролів.
Багато систем використовують бази даних для аутентифікації користувачів і існує декілька способів зберігання паролів:
Паролі зберігаються як є. При зломі такої бази всі паролі стануть відомі.
Зберігаються тільки хеші паролів. Знайти паролі можна використовуючи заздалегідь підготовлені таблиці хешів. Такі таблиці складаються з хешів простих або популярних паролів.
До кожного паролю додається кілька випадкових символів (їх називають «сіль») і результат хешується. Отриманий хеш разом з «сіллю» зберігаються у відкритому вигляді. Знайти пароль за допомогою таблиць таким методом не вийде[2].
Як працює md5
Тепер подивимося, як саме працює MD5. Для обробки MD5 отримує деякий рядок. Цей рядок перетвориться в послідовність з нулів і одиниць. Такі дій виконуються за допомогою системи, яка видає кожному символу свій номер. Ці номери можна записати в двійковій системі числення. Виходить, кожен символ можна записати як послідовність нулів і одиниць. Якщо цим скористатися, отримаємо з рядка послідовність з нулів і одиниць. Нехай q буде довжиною отриманої послідовності (рівно 64 біта, можливо, з незначними нулями). До отриманої послідовності приписується 1. В результаті довжина послідовності збільшується на 1. Потім до послідовності приписуються нулі, поки довжина не стане по модулю 512 дорівн 448 (length mod 512 = 448). Далі до послідовності дописують молодші 32 біта числа q, а потім - старші. Довжина послідовності стає кратною 512. Отриману послідовність назвемо S. Для підрахунку результату використовуються чотири подвійні слова (32 біта). Ці подвійні слова не започатковано наступними шістнадцятирічними значеннями, де першим слід наймолодший байт:
A: 01 23 45 67 B: 89 ab cd ef C: fe dc ba 98 D: 76 54 32 10
Також для підрахунку результату використовуються наступні функції:
F(X,Y,Z) = XY v not(X) Z G(X,Y,Z) = XZ v Y not(Z) H(X,Y,Z) = X xor Y xor Z I(X,Y,Z) = Y xor (X v not(Z))
X, Y, Z — це подвійні слова. Результати функцій, також подвійні слова. Для підрахунку використовується ще одна функція (назвемо її W). Вона хитро обробляє дані і повертає результат. Обробка даних відбувається з використанням функцій F, G, H, I[3].
Рис.2.1.
Схематично зображена функція. Зліва -
вхідні дані, праворуч - вихідні.
Всі необхідні функції і позначення розглянуті. Тепер розглянемо, як відбувається прорахунок результату:
1. Запам'ятовуємо перші 512 біт послідовності S.
2. Видаляємо перші 512 біт послідовності S (можна обійтися і без видалення, але тоді на першому кроці треба брати не перші 512, а
наступні 512 біт).
3. Викликаємо функцію W. Параметри A, B, C, D — це поточні значення відповідних подвійних слів. Параметр T — це після успішної реєстрації 512 біт.
4. Додаємо до A A0.
5. B = B + B0.
6. C = C + C0.
7. D = D + D0.
8. Якщо довжина послідовності 0, виходимо.
9. Переходимо до кроку 1.
Після виконання цього алгоритму A, B, C, D — це результат (його довжина буде 128 біт). Часто можна бачити результат MD5 як послідовність з 32 символів 0..f. Це те ж саме, тільки результат записаний не в двійковій системі числення, а в шістнадцятирічній[4].
