Сбор атомов на 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 различных хэшей SHA-1 ... 10 48 .
Что это эквивалент? Ну, Луна состоит из 10 47 атомов. Так что, если у нас есть 10 Лун ... и вы случайно выберете один атом на одной из этих лун ... и затем снова выберете случайный атом на них ... тогда вероятность того, что вы выберете один и тот же атом дважды , вероятность того, что два данных git коммита будут иметь одинаковый хэш SHA-1.
Развивая это, мы можем задать вопрос ...
Сколько коммитов вам нужно в репозитории, прежде чем начинать беспокоиться о коллизиях?
Это относится к так называемым «атакам на день рождения», что, в свою очередь, относится к «парадоксу дня рождения» или «проблеме рождения», которая гласит, что при случайном выборе из заданного набора вам нужно на удивление несколько отборов, прежде чем вы, скорее всего, сделаете это, чем нет. выбрать что-то дважды. Но «на удивление мало» - это очень относительный термин здесь.
В Википедии есть таблица вероятности столкновений с Парадоксом Дня Рождения . Нет записи для хеша из 40 символов. Но интерполяция записей для 32 и 48 символов приводит нас к диапазону 5 * 10 22 git коммитов с вероятностью столкновения 0,1%. Это пятьдесят тысяч миллиардов миллиардов различных коммитов , или пятьдесят Зетта коммитов , прежде чем вы достигнете даже 0,1% вероятности вашего столкновения.
Сумма байтов только хэшей для этих коммитов будет больше данных, чем все данные, сгенерированные на Земле за год, то есть вам нужно будет производить код быстрее, чем YouTube транслирует видео. Удачи с этим. : D
Суть в том, что если кто-то намеренно не вызывает столкновение, вероятность случайного происшествия настолько мала, что вы можете игнорировать эту проблему.
«Но когда столкновение действительно произойдет, то , что происходит на самом деле?»
Хорошо, предположим, что невероятное действительно случается, или предположим, что кому-то удалось приспособить преднамеренное столкновение SHA-1 . Что происходит потом?
В этом случае есть отличный ответ, когда кто-то экспериментировал с этим . Я процитирую из этого ответа:
- Если BLOB-объект уже существует с таким же хешем, вы вообще не получите никаких предупреждений. Кажется, все в порядке, но когда вы нажимаете, кто-то клонирует, или вы возвращаетесь, вы потеряете последнюю версию (в соответствии с тем, что описано выше).
- Если объект дерева уже существует, и вы создаете BLOB-объект с таким же хешем: все будет казаться нормальным, пока вы не попробуете подтолкнуть или кто-то клонирует ваш репозиторий. Тогда вы увидите, что репо повреждено.
- Если объект фиксации уже существует, и вы создаете BLOB-объект с таким же хешем: такой же как # 2 - поврежден
- Если BLOB-объект уже существует, и вы создаете объект коммита с тем же хешем, он не будет работать при обновлении «ref».
- Если BLOB-объект уже существует, и вы создаете объект дерева с таким же хешем. Это не удастся при создании коммита.
- Если древовидный объект уже существует, и вы делаете коммит-объект с таким же хешем, то произойдет сбой при обновлении 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