Криптографічна геш-функція

Матеріал з Вікіпедії — вільної енциклопедії.
(Перенаправлено з Криптографічна хеш-функція)
Перейти до навігації Перейти до пошуку
Криптографічна геш-функція (а саме, SHA-1) в роботі. Зауважте, що навіть мала зміна даних на вході (тут в слові «over») значно змінює вихід, через так званий лавиновий ефект.

Криптографічна геш-функція — це геш-функція, яка є алгоритмом, що приймає довільний блок даних і повертає рядок встановленого розміру, (криптографічне) геш-значення, таке що (випадкові або навмисні) зміни даних (з дуже високою ймовірністю) змінять геш-значення. Дані до кодування часто звуть «повідомлення», а геш-значення іноді називають дайджест повідомлення (англ. message digest) або просто дайджест, дослівно «стислий виклад».

Ідеальна криптографічна геш-функція має чотири основні властивості:

  • легкість обчислення геш-значення для будь-якого повідомлення
  • нездійсненно утворити повідомлення для заданого геш-значення
  • нездійсненно змінити повідомлення без зміни геша (лавиновий ефект)
  • нездійсненно знайти два різних повідомлення з тим самим гешем

Криптографічні геш-функції часто застосовуються в інформаційній безпеці, особливо в цифровому підписі, коді автентифікації повідомлення (MAC) та інших формах автентифікації. Їх також можна використати як звичайну геш-функцію, для індексування даних в геш-таблиці, для виявлення повторення даних або унікального ототожнювання файлів і як контрольну суму для виявлення пошкодження даних. Насправді, в розрізі інформаційної безпеки, криптографічні геш-значення іноді називають (цифровими) відбитками пальців, контрольними сумами або просто геш-значеннями,хоча всі ці терміни означають функції швидше з різними властивостями і цілями.

Властивості[ред. | ред. код]

Більшість криптографічних геш-функцій спроектовано так, щоб на вхід подавався рядок довільної довжини, а на виході ми отримували геш-значення встановленої довжини.

Криптографічна геш-функція повинна витримувати всі відомі типи криптографічних атак. Щонайменше, вона повинна мати наступні властивості:

  • Першовзорова стійкість
    для певного гешу має бути складно знайти повідомлення , таке що . Ця концепція стосується односторонньої функції. Функції, що не відповідають цій властивості вразливі до атак знаходження першовзору.
  • Друга першовзорова стійкість
    Для певного входу має бути складно знайти інший вхід — де , такий що . Цю властивість іноді називають слабка колізійна стйкість (англ. weak collision resistance), і функцій, що не мають цієї властивості вразливі до атак знаходження першовзору другого роду.
  • Колізійна стійкість
    Повинно бути складно знайти два різних повідомлення і , таких що . Така двійка зветься криптографічна геш-колізія. Цю властивість іноді називають сильна колізійна стійкість (англ. strong collision resistance). Воно вимагає щонайменше вдвічі довшого геш-значення ніж потрібно для першовзорової стійкості, інакше колізії можна знайти за допомогою атаки «днів народження».

Ці властивості мають на увазі, що зловмисник не може змінити вхідні дані без зміни дайджеста. Отже,якщо два рядки мають однаковий дайджест можна бути впевненим, що й самі вони такі.

Функції, що відповідають цим вимогам все ще можуть мати небажані властивості. Наразі[коли?] популярні криптографічні геш-функції вразливі до атак через довжинне доповнення (англ. length-extension): знаючи і , але не знаючи , через вибір відповідного нападник може обчислити де позначає конкатенацію[1]. Цю властивість можна використати, щоб розбити наївну схему автентифікацію побудовану на геш-функції. HMAC обходить цю проблему.

В ідеалі, користувач може забажати сильніших вимог. Унеможливити для супротивника знайти два повідомлення з істотно схожими дайджестами; або виявити буді-яку корисну інформацію про дані, маючи лише дайджест. Отже, криптографічна геш-функція наскільки можливо подібно до випадкової функції, залишаючись детерміністичною і ефективно обчислювальною.

Алгоритми контрольних сум, такі як CRC32 та інші циклічні надлишкові перевірки, спроектовані із дотриманням набагато слабших вимог, і зазвичай непридатні для використання як криптографічні геш-функції. Наприклад, CRC використовували для цілісності повідомлень в WEP стандарті шифрування, але була легко віднайдена атака, що використовувала лінійність контрольної суми.

Ступінь складності[ред. | ред. код]

У криптографічній практиці, складність зазвичай значить майже певно поза досяжністю будь-якого супротивника, який не повинен мати змогу зламати систему впродовж часу коли безпека система вважається потрібною. Внаслідок цього значення терміну залежить від застосування, бо зусилля, що зловмисник може затратити на задачу зазвичай пропорційне його очікуваній вигоді. Однак, через те, що необхідні зусилля ростуть дуже швидко з довжиною дайджеста, навіть покращення потужності обчислення в тисячі разів можна знешкодити додаванням кількох десятків бітів наприкінці.

У деяких теоретичних аналізах складність має особливе математичне значення, таке як нерозв'язний за асимптотичний поліноміальний час. Такі інтерпретації складності важливі у вивчанні доказово безпечних криптографічних геш-функцій, але зазвичай не мають сильного зв'язку з практичною безпекою. Наприклад, алгоритм експоненці́йного часу іноді може бути досить швидким для здійсненної атаки. І навпаки, алгоритм поліноміального часу (наприклад, такий що вимагає n20 кроків для ключа в n цифр) може бути заповільним для практичного використання.

Приклад використання[ред. | ред. код]

Покажемо можливе використання криптографічної геш-функції: Аліса подає складну математичну проблему Бобові, і заявляє, що вона розв'язала її. Боб хотів би розв'язати її самостійно, але також хоче впевнитись що Аліса не блефує. Отже Аліса записує свій розв'язок, додає випадкове криптографічне число. Обчислює геш-значення і передає його Бобу (тоді як розв'язок і випадкове число залишаються в секреті). Тоді, за кілька днів, Боб приходить зі своїм розв'язком, і Аліса може довести, що вона мала розв'язок раніше відкриваючи випадкове число Бобові. (Це приклад простої схеми зобов'язання).

Застосування[ред. | ред. код]

Перевірка цілісності файлів або повідомлень[ред. | ред. код]

Важливим застосуванням безпечних гешів є перевірка цілісності повідомлень. Визначення чи були внесені якісь зміни в повідомлення (або файл), наприклад, можна здійснити порівнянням дайджестів до і після передачі (або іншої події).

Пов'язаним застосуванням є перевірка паролів. Зазвичай паролі не зберігаються відкритим текстом, а зберігаються їх геш-значення. Для автентифікації користувача, пароль наданий користувачем гешується і порівнюється зі збереженим гешем. Це також значить, що первинний пароль неможливо відновити, і при втраті його необхідно замінити новим.

Ідентифікатор файлу або даних[ред. | ред. код]

Геш-значення також може слугувати як спосіб надійного ототожнення файлів; декілька систем керування версіями, включно з Git, Mercurial і Monotone, використовують sha1sum різнотипного вмісту для унікального ототожнення. Геші використовують для ідентифікації фалів в peer-to-peer мережах спільного використання файлів. Наприклад, ed2k link, варіант геша MD4 поєднаний із розміром файлу, забезпечує достатню інформацію для знаходження джерела файлу, завантаження файлу і перевірки його вмісту. Інший приклад — це magnet-посилання. Такі файлові геші часто використовують як кореневі геші геш-списків або геш-дерев.

Одне з головних застосувань геш-функцій — це можливість швидкого пошуку даних в геш-таблиці. Будучи геш-функцією певного типу, криптографічна геш-функція поводиться добре і тут також.

Однак, порівняно зі стандартною геш-функцією, криптографічна геш-функції тяжіють до більшої обчислювальної складності. Через це, їх більше використовують у випадках, де користувачу необхідно захистити себе від можливої підробки зловмисником.

Псевдовипадкова генерація й утворення ключів[ред. | ред. код]

Геш-функції також можна використати як породжувач псевдовипадкових бітів або для виведення нових ключів чи паролів з одного секретного ключа або пароля.

Геш-функції засновані на блочних шифрах[ред. | ред. код]

Існує декілька способів використання блочних шифрів для побудови криптографічних геш-функцій, особливо односторонньої функції стискання.

Методи нагадують режими операцій блочних шифрів зазвичай використовні для шифрування. Всі добре відомі геш-функції, включно з MD4, MD5, SHA-1 і SHA-2 побудовані зі складових подібних до блочних шифрів спроектованих для них, із гарантією, що отримана функція не бієктивна. Серед фіналістів змагання геш-функцій від NIST (SHA-3) присутні геш-функції зі складовими подібними до блочних шифрів (наприклад, Skein, BLAKE) та функції на основі інших дизайнів (Наприклад, JH, Keccak).

Стандартний блочний шифр такий як AES можна використати замість цих спеціальних блочних шифрів; це може бути корисним коли вбудована система має забезпечувати шифрування і гешування з мінімальним за розміром кодом або розміром плати. Однак, такий підхід відбувається на дієвості і безпеці. Шифри в геш-функціях створені для гешування: вони використовують великі ключі і блоки, можуть дієво змінювати ключ щоблока, і розроблені і перевірені на стійкість до атак з пов'язаними ключами. Шифри загального призначення мають різні цілі. Зокрема, розміри ключа і блоку в AES роблять нетривіальним використання його для утворення довгих геш-значень; шифрування з AES стає менш дієвим коли ключ змінюється щоблока; і атака з пов'язаними ключами робить його менш безпечним для використання в геш-функціях ніж для шифрування.

Будова Меркла-Демґарда[ред. | ред. код]

Будова геша за Мерклом-Демґардом.

Геш-функція повинна бути в змозі перевести повідомлення довільної довжини в вихід встановленої довжини. Цього можна досягти через розбиття даних на вході в ряд блоків однакової довжини, і опрацювання їх послідовно із використанням односторонньої функції стискання. Функція стискання може бути розроблена для гешування або утворена з блочного шифру. Геш-функція побудована за будовою Меркла-Демґарда є настільки колізійно стійкою наскільки така її функція стискання; Будь-яку колізію геш-функції в цілому можна прослідити до колізії в функції стискання.

Останній оброблений блок також повинен бути однозначно довжинно-доповненим; це критично для безпеки побудови. Такий підхід зветься — будова Меркла-Демґарда. Найширше використовні геш-функції, включно з SHA-1 і MD5, мають такий вигляд.

Будова має деякі властиві вади, включно з атаками через довжинне доповнення (англ. length-extension) і створити-і-вставити (англ. generate-and-paste), також не може використати переваги паралельного обчислення. Тому, багато[скільки?] учасників змагання геш-функцій від NIST спроектовані на інших засадах.

Використання в побудові інших криптографічних примітивів[ред. | ред. код]

Геш-функції можна використати для будови інших криптографічних примітивів. Щоб отримані примітиви були криптографічно безпечними, треба обережно підходити до будови, щоб вислід був правильним.

MAC (Також відомі як геш-функції з ключем) часто будують з геш-функцій. HMAC є таким прикладом.

Так само як і блочні шифри можливо використовувати для будови геш-функцій, геш-функції можливо використовувати для побудови шифрів. Будови Luby-Rackoff із використанням геш-функцій можуть бути доказово безпечними, якщо підлегла функція безпечна. Також багато геш-функцій (включно з SHA-1 і SHA-2) побудовані із використанням спеціально розроблених блочних шифрів в будові Дейвіса-Меєра (англ. Davies-Meyer) або іншій. Див. SHACAL, BEAR і LION.

Генератор псевдовипадкових чисел можна побудувати із використанням геш-функції. Це робиться поєднанням (секретного) випадкового зерна з лічильником і наступним гешуванням.

Деякі функції, такі як Skein, Keccak і RadioGatún видають довільної довжини потік і їх можна використати як потоковий шифр, хоча потоковий шифр також можна побудувати і з геш-функції з дайджестом встановленого розміру. Часто це роблять спочатку будуючи криптографічно безпечний генератор псевдовипадкових чисел і тоді використовуючи цей потік як ключ. Потоковий шифр SEAL, що використовує SHA-1 для побудови внутрішніх таблиць, які потім використовуються в генераторі ключа. Не надається гарантії, що SEAL так само сильний або слабкий як SHA-1.

Конкатенація криптографічних геш-функцій[ред. | ред. код]

Зчеплюючи виходи кількох геш-функцій ми отримуємо стійкість до колізій настільки високу як у найсильнішого з використаних алгоритмів. Наприкад, старіші версії TLS/SSL використовують об'єднані суми MD5 і SHA-1; це гарантувало, що метод віднайденя колізій в одній з цих функцій не дозволить підробити трафік захищений обома.

Для геш-функцій Меркла-Демгарда, зчеплена функція так само колізійно-стійка як і її найсильніша складова,[2] але не більше.[3] Joux[4] зауважив, що 2 колізії призводять до n колізій: якщо здійсненно знайти два повідомлення з однаковим гешем MD5, тоді фактично не більш складно знайти скільки завнодно повідомлень з таким самим гешем MD5. Посеред n повідомлень з однаковим гешем MD5, ймовірно трапиться колізія в SHA-1. Додаткова робота по знаходженню колізій SHA-1 поліноміальна. Цей довід підсумований Finney. Сучаснішій документ з повним доведенням безпечності такої поєднаної конструкції і чіткішим і повним поясненням викладеного.[5]

Криптографічні геш-алгоритми[ред. | ред. код]

Існує велика кількість криптографічних геш-функцій, багато з них виявили вразливість і не повинні використовуватись. Навіть вдала атака проти послабленого варіанту може підірвати впевненість експертів і призвести до припинення застосування. Наприклад, в серпні 2004 знайшли слабкість в багатьох поширених на той час функціях, включно з SHA-0, RIPEMD і MD5. Це поставило питання про безпечність в перспективі геш-функцій отриамних на їх основі — зокрема, SHA-1 (посилена версія SHA-0), RIPEMD-128 і RIPEMD-160 (посилені версії RIPEMD). Ані SHA-0, ані RIPEMD не використовувались широко, бо були замінені на посилені версії.

Станом на 2009, найвживаніші криптографічні геш-функції це MD5 і SHA-1. Однак, MD5 зламали; атаку проти них використали для зламу SSL в 2008.[6]

Геш-функції SHA-0 і SHA-1 розробило NSA. У лютому 2005, повідомили про успішну атаку на SHA-1, знаходження колізій за приблизно 269 операцій гешування, замість 280 очікуваних для 160-бітної геш-функції. В серпні 2005, повідомили про іншу успішну атаку на SHA-1, знаходження колізій за 263 операцій. Нові застосунки можуть уникнути цього через використання наступних членів сім'ї SHA, таких як SHA-2, або використання підходів на кшталт випадкового гешування за якого вхід опрацьовується із якимсь випадковим значенням перед застосуванням геш-функції,[7][8] які не потребують колізійної стійкості.

Однак, для гарантування тривалої безпеки застосунків, що використовують геш-функції, запроваджено змагання з метою заміни для SHA-2, нова геш-функція отримає ім'я SHA-3 і стане федеральним стандартом у 2012.[9] NIST випустив SHA-3 у серпні 2015.

У 2015 році в Україні розроблено геш-функцію Купина, яку введено в дію як національний стандарт ДСТУ 7564:2014 «Інформаційні технології. Криптографічний захист інформації. Функція хешування»[10]

Хешування Біткойна[ред. | ред. код]

Транзакції платіжної системи Біткойна, які представляються у вигляді деякого масиву даних, об'єднуються в блоки (надалі, сукупність всіх блоків називатимемо блокчейном) і проходять через алгоритм хешування, тобто дані їх полів подаються на вхід криптографічної хеш-функції. Кожна транзакція вказує, звідки списуються кошти та куди вони прямують. Для вказівки адресата використовується його публічний ключ (унікальний ідентифікатор мережі Біткойн). Щоб адресат міг використати отримані гроші в рамках протоколу біткойна (виключаємо продаж власного гаманця — Wallet), він має створити нову транзакцію, яка братиме валюту з попередньої та перенаправлятиме за іншою адресою, використовуючи публічний ключ. Відповідно, нова транзакція разом із транзакціями інших користувачів мережі біткойн потрапить у новий блок. Таким чином число блоків у блокчейні зростає. Проте, кожна транзакція має бути схвалена — система має дійти консенсусу. Для цього є кілька способів, але в Біткойні використовується принцип Proof-of-Work (PoW). Після прийняття транзакції вона вважається справжньою і криптовалюта переходить від одного гаманця до іншого.

Система Біткойна є децентралізованою системою без виділених центрів генерації блоків. Кожен учасник може взяти набір транзакцій, що очікують включення до журналу, та сформувати новий блок. Більше того, у системах типу BitCoin такий учасник (майнер) ще й отримає премію у вигляді певної суми чи комісійних від прийнятих до блоку транзакцій.

Не можна просто сформувати блок у децентралізованих системах. Система має дійти консенсусу, тобто отримати схвалення. Для цього є кілька способів, але в Біткойні використовується принцип Proof-of-Work (PoW). Надійність таких систем полягає саме в тому, що новий блок не можна сформувати швидше (у середньому), ніж за певний час. Наприклад, за десять хвилин (BitCoin).

Примітки[ред. | ред. код]

  1. MD5 Length Extension Attack Revisited - Vũ's Inner Peace. vudang.com. Архів оригіналу за 29 October 2014.
  2. Зауважте, що будь-які два повідомлення, які утворюють колізію зчепленої функції, також утворюють колізії для всіх складових через природу дії зчеплення. Наприклад, якщо concat(sha1(message1), md5(message1)) == concat(sha1(message2), md5(message2)) тоді sha1(message1) == sha1(message2) і md5(message1)==md5(message2). Зчеплені функції можуть мати інші вади яких не має найсильніша функція — наприклад, вони можуть відкривати інформацію про повідомлення, хоча найсильніша складова ні, або бути виявити невипадковість тоді як найсильніша складова не має такої властивості — але не можуть бути менш колізійно-стійкими.
  3. Загальніше, якщо атака може створити колізію в внутрішньому стані однієї геш-функції, атакування всієї конструкції є лише так само складним як атака «днів народження» проти інших функцій. Дивись подробиці в наступних посиланнях на Joux і Finney.
  4. Antoine Joux. Multicollisions in Iterated Hash Functions. Application to Cascaded Constructions. LNCS 3152/2004, pages 306-316 Full text [Архівовано 2017-04-27 у Wayback Machine.].
  5. Jonathan J. Hoch and Adi Shamir. On the Strength of the Concatenated Hash Combiner when all the Hash Functions are Weak. — 2008. — 20 лютого. Архівовано з джерела 5 травня 2012. Процитовано 18 травня 2012.
  6. Alexander Sotirov, Marc Stevens, Jacob Appelbaum, Arjen Lenstra, David Molnar, Dag Arne Osvik, Benne de Weger, MD5 considered harmful today: Creating a rogue CA certificate [Архівовано 20 вересня 2017 у Wayback Machine.], accessed March 29, 2009
  7. Shai Halevi, Hugo Krawczyk, Update on Randomized Hashing [Архівовано 5 червня 2011 у Wayback Machine.]
  8. Shai Halevi and Hugo Krawczyk, Randomized Hashing and Digital Signatures [Архівовано 20 червня 2009 у Wayback Machine.]
  9. NIST.gov - Computer Security Division - Computer Security Resource Center. Архів оригіналу за 9 липня 2011. Процитовано 21 травня 2012.
  10. http://www.dsszzi.gov.ua/dstszi/control/uk/publish/article?art_id=120158&cat_id=119123 [Архівовано 18 вересня 2016 у Wayback Machine.] Держспецзв’язку впроваджує нові стандарти криптографічного захисту інформації