Збір атомів на 10 Місяць
Хеш SHA-1 - це шістнадцятковий рядок символів ... це 4 біти на символ 40 разів - 160 біт. Тепер ми знаємо, що 10 біт приблизно 1000 (точніше 1024), тобто 1 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 різних хешів SHA-1 ... 10 48 .
Що таке еквівалент? Ну а Місяць складається приблизно з 10 47 атомів. Отже, якщо у нас є 10 Місяць ... і ви випадковим чином виберете один атом на одній із цих лун ... а потім продовжуйте і знову вибираєте на них випадковий атом ... то ймовірність того, що ви виберете той самий атом двічі , є ймовірність того, що два дані git-коміти матимуть однаковий хеш SHA-1.
Розширюючи це, ми можемо задати питання ...
Скільки комісій вам потрібно в сховищі, перш ніж почати турбуватися про зіткнення?
Це стосується так званих "Нападів на день народження", що, в свою чергу, посилається на "Парадокс від дня народження" або "Проблема з днем народження", де зазначено, що коли ви вибираєте випадковим чином з заданого набору, вам потрібно напрочуд кілька виборів, перш ніж ви швидше, ніж ні щоб двічі щось вибрав. Але "напрочуд мало" - тут дуже відносний термін.
У Вікіпедії є таблиця щодо ймовірності зіткнень Парадокса Дня народження . Для хеша з 40 символами немає запису. Але інтерполяція записів на 32 та 48 символів приводить нас до діапазону 5 * 10 22 git, що здійснює 0,1% ймовірності зіткнення. Це п’ятдесят тисяч мільярдів різних доручень , або п’ятдесят Zettacommissions , перш ніж ви досягнете навіть 0,1% шансу на те, що у вас зіткнення.
Сума байтів хешів для цих комітетів буде більше даних, ніж усіх даних, що генеруються на Землі за рік, а це означає, що вам потрібно буде виправити код швидше, ніж YouTube виводить відео. Успіхів у цьому. : D
Суть у тому, що якщо хтось навмисно не спричинив зіткнення, ймовірність того, що трапиться випадково, настільки приголомшливо мала, що ви можете проігнорувати це питання
«Але коли зіткнення дійсно станеться, то , що відбувається на самому ділі?»
Гаразд, припустимо, що малоймовірне трапляється, чи припустимо, що комусь вдалося пристосувати навмисне зіткнення хешу SHA-1 . Що ж відбувається тоді?
У цьому випадку є чудова відповідь, де хтось експериментував над цим . Я цитую з цієї відповіді:
- Якщо крап вже існує з тим самим хешем, ви взагалі не отримаєте попереджень. Здається, все нормально, але коли ви натискаєте, хтось клонується, або ви повернетесь, ви втратите останню версію (відповідно до того, що пояснено вище).
- Якщо деревооб'єкт вже існує, і ви робите крапку з таким же хешем: все буде здаватися нормальним, поки ви не спробуєте натиснути або хтось не клонує ваше сховище. Тоді ви побачите, що РЕПО зіпсоване.
- Якщо об’єкт фіксації вже існує, і ви робите крапку з таким же хешем: такий же, як №2 - пошкоджується
- Якщо блоб вже існує, і ви робите об'єкт фіксації з тим же хешем, він не вийде при оновленні "ref".
- Якщо крапля вже існує, і ви робите об’єкт з дерева з таким же хешем. Він не вдасться створити команду.
- Якщо деревооб'єкт вже існує і ви робите об’єкт фіксації з тим самим хешем, він не вийде при оновленні "ref".
- Якщо деревооб'єкт вже існує, і ви робите об’єкт дерева з таким же хешем, все буде здаватися нормальним. Але коли ви здійснюєте, усі сховища посилаються на неправильне дерево.
- Якщо об’єкт фіксації вже існує, і ви робите об’єкт фіксації з тим самим хешем, все буде здаватися нормальним. Але коли ви здійснюєте, комітка ніколи не буде створена, і вказівник HEAD буде переміщений до старого.
- Якщо об’єкт фіксації вже існує, і ви робите деревний об’єкт з тим самим хешем, він не вийде при створенні фіксації.
Як вам здається, деякі випадки не є гарними. Особливо випадки №2 та №3 псують ваше сховище. Однак здається, що помилка залишається всередині цього сховища, і атака / химерна неймовірність не поширюється на інші сховища.
Крім того, здається, що питання про навмисні зіткнення визнається реальною загрозою, і, наприклад, GitHub вживає заходів для її запобігання .
I've been informed by the git Gods that the chances of a SHA1 collision is the same as the Earth being sucked up into the black hole created by the CERN accelerator. If this is indeed true, then there's no need for that extra memcmp.
, джерело: lwn.net/Articles/307281