Що робить алгоритм хешування "безпечним"?


19

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

То в чому відмінність? Чи не вихід є лише випадковим числом, що представляє хешовану річ? Що робить деякі алгоритми хешування безпечними?


8
Це питання краще підходить для веб-сайту IT Security SE.
Бернар

@Bernard Якщо це так, то я добре з цим, але моє питання насправді було не про те, як і коли використовувати захищений хеш, а те, що відрізняє алгоритм захищеного хешування від незахищеного. Це здається мені більше питанням щодо програмування, але я не переглядаю IT Security SE, так що, можливо, це теж працює.
CodexArcanum

2
Дуже подібне питання вже було задано щодо ІТ-безпеки
ChrisF

Відповіді:


34

Кожна криптографічна хеш-функція потрібна три властивості H:

  • Прообраз опір : Беручи під увагу h, що повинно бути важко знайти якесь - або значення xз h = H(x).

  • другий опір прообразу : З огляду на x1, що повинно бути важко знайти x2 != x1з H(x1) = H(x2).

  • стійкість до зіткнення : Слід знайти два значення за x1 != x2допомогою H(x1) = H(x2).

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

  • слабкий опір зіткнення : для випадкових (або "типово") вибраних значень домену шанс зіткнення невеликий. Це нічого не говорить про те, що зловмисник навмисно намагається створити зіткнення або намагається знайти переваги.

Три вищевказані властивості є (серед) цілями проектування для кожної криптографічної хеш-функції. Для деяких функцій (наприклад, MD4, SHA-0, MD5) відомо, що це не вдалося (принаймні частково). Поточне покоління (SHA-2) передбачається надійним, а наступне ("Алгоритм безпечного хешу 3") наразі перебуває в стадії стандартизації після змагань .

Для деяких застосувань (наприклад, хешування паролів та виведення ключів із паролів), домен фактично використаних значень xнастільки малий, що жорстоке форсування цього простору стає можливим за допомогою звичайних (швидких) захищених хеш-функцій, і це коли ми також хочемо:

  • повільне виконання : Враховуючи x, що для обчислення значення потрібна мінімальна (бажано настроювана) кількість ресурсів H(x).

Але для більшості інших цілей цього не потрібно, а потрібно:

  • швидке виконання : Дано x, обчислення значення H(x)є максимально швидким (при цьому ще надійним).

Існують деякі конструкції (наприклад, PBKDF2 та scrypt) для створення повільної хеш-функції від швидкої, ітерації її часто.

Для отримання детальної інформації ознайомтеся з хеш-тегом нашого сестринського сайту Cryptography Stack Exchange.


3

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

Деякі характеристики:

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

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


3

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

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

Для прикладу останнього: якщо обчислення хеша займає 50 мс, воно не матиме ніякого впливу на звичайний логін користувача (тобто більшість користувачів не помітять різниці 50 мс при вході в систему). У той же час, якщо зловмисник хоче здійснити атаку зі словника, можливість генерувати лише 20 хешів секунди - це серйозний гандикап. Іншими словами, для якихось причин для безпечного хешу краще повільніше.


3
У області функцій криптографічного хешу існують дві важливі підгрупи: швидка (використовується для аутентифікації повідомлення, підпису тощо) та повільна - використовується для виведення ключів та хешування паролів. Не змішуйте їх, є програми для обох.
Paŭlo Ebermann

Насправді також є хеш-функції, які створені для максимального зіткнення: Soundex - приклад. Очевидно, це робить його дуже хитро захищеним хеш-функцією.
Йорг W Міттаг

@ JörgWMittag: Не просто балакучий як захищений хеш, але також буде дуже поганим для використання з хеш-таблицею. Потім знову, хоча, звичайно, дещо хеш-подібний, я б вагався називати Soundex хеш-функцією, просто тому, що його намір та використання так досконало відрізняються від звичайних хеш-функцій.
Джеррі Труну

@JerryCoffin: Я думаю, це залежить від визначення. Наприклад, на сторінці англійської Вікіпедії просто сказано, що хеш-функція - це будь-який алгоритм або підпрограма, яка відображає більший (потенційно нескінченний) набір довільних значень на менший, кінцевий набір (зазвичай скалярних) значень. В той час, як на німецькій сторінці Вікіпедії сказано, що "хешування" (німецьке: "zerhacken") є невід'ємною частиною, тобто що уникнення зіткнення та розподіл відображених значень є ключовим. Soundex дуже відповідає першому визначенню, а не другому.
Йорг W Міттаг

3

Прочитайте це http://www.codinghorror.com/blog/2012/04/speed-hashing.html, це пояснить усе набагато краще, ніж я міг коли-небудь пояснити. Ось два найважливіші заголовки в статті, які безпосередньо стосуються вашого питання:

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

Його підрозділ TL; DR в кінці:

Якщо ви користувач:

Переконайтеся, що всі ваші паролі містять 12 символів або більше, в ідеалі - набагато більше. Я рекомендую приймати фразові фрази, які запам'ятовуються не тільки набагато простіше, ніж паролі (якщо вони не вводяться), але й смішно захищають від грубої форсировки виключно через їх довжину.

Якщо ви розробник:

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


4
Джефф помиляється тут у другому пункті ... тоді як для деяких застосувань (як хешування паролів та виведення ключа з пароля) ви хочете бути повільними, для інших застосувань (наприклад, автентифікація повідомлень, підписи тощо) швидко (безпечно) хеш-функції хороші.
Paŭlo Ebermann

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

2
@Nate "Більш безпечний" завжди неоднозначний, але навіть у найбільш благодійній програмі "повільні хеші завжди безпечніші, ніж швидкі", безумовно, неправильно. Існує безліч застосунків, коли швидкість хеша не має значення.
Жил 'ТАК - перестань бути злим'

@Gilles ви можете навести приклад? Це насправді звучить правдиво, але більше конкретики було б корисно.
Нейт

2
@Nate Найбільш очевидним застосуванням хесів є перевірка цілісності даних: передайте хеш по захищеному, але можливо, каналу з низькою пропускною здатністю, передайте можливо велику корисну навантаження по незахищеному каналу, а потім перевірте, чи отримана корисна навантаження має очікуваний хеш. Хеші також чітко відображаються у методах підписання (де ви не тільки перевіряєте цілісність, але і те, хто вам надіслав дані). Хеширование паролів - швидше виняток.
Жиль "ТАК - перестань бути злим"

2

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

Хеш, як правило, вважається "захищеним", якщо, даючи повідомлення M, хеш-функцію хеш (), і значення хеша Н, вироблене хеш (М), довжиною в бітах L, жодне з наступного не може бути виконане менше, ніж O (2 л ) час:

  • Враховуючи хеш () та Н, виробляють М. (стійкість до зображення)
  • Враховуючи хеш () і M, виробляють інший M 2 такий, що хеш (M 2 ) == H. (слабкий опір зіткнення)
  • Враховуючи хеш (), виробляють будь-які M 1 і M 2 такі, що хеш (M 1 ) == хеш (M 2 ). (сильний опір зіткнення)

Крім того, "захищений" хеш повинен мати довжину хеша L таку, що 2 Lне є можливою кількістю кроків для виконання комп'ютером заданого обладнання. 32-бітний цілочисельний хеш може мати лише 2,1 млрд. Значень; хоча попередня атака (пошук повідомлення, що створює певний хеш-H), займе певний час, для багатьох комп’ютерів, особливо тих, що знаходяться в руках урядових установ, зафрахтованих з розбиттям коду, це неможливо. Крім того, алгоритм, який створює та зберігає випадкові повідомлення та їх хеші, за вірогідністю, би на 50% вистрілив у пошуку дублікату хешу з кожним новим повідомленням після спроби лише 77000 повідомлень, і мав би 75% шанс потрапити на дублікат після лише 110 000. Навіть у 64-бітових хешей все ще є 50% шансу зіткнутися після спроби лише близько 5 мільярдів значень. Така сила нападу дня народження на маленькі хеши. На противагу, десятильйона чисел (1,5 * 10 34 ).

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

Крім невеликого розміру хешу, інші фактори, які можуть зробити хеш демонстративно незахищеними, є:

Низька робота - хеш, призначений для використання хештайлом або для інших цілей типу "контрольна сума", зазвичай розрахований на обчислювально недорогі. Це набагато полегшує грубу атаку.

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

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


0

Використовуйте правильний алгоритм для заданої задачі.

CRC використовуються для виявлення / виправлення помилок.

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

У хеш-таблицях / словниках / картах використовується SipHash .

Те, що ви називаєте незахищеними алгоритмами хешування, не повинно використовуватися в хеш-таблицях , що підтверджено такими записами CVE: CVE-2003-0364, CVE-2011-4461, CVE-2011-4838, CVE-2011-4885, CVE-2011- 4462, CVE-2011-4815, CVE-2012-0840, CVE-2012-5371 , CVE-2012-5374, CVE-2012-5375

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.