Какая самая короткая пара строк вызывает коллизию MD5?

До какой длины строки можно использовать MD5 в качестве хеша, не беспокоясь о возможности коллизии?

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

Это уже было проверено на MD5, SHA1 и т. Д.?


person Alf Eaton    schedule 04.01.2010    source источник
comment
К сожалению, и MD5, и SHA1 считаются почти взломанными, потому что общий ответ для криптографической хеш-функции с хорошей репутацией: не беспокойтесь о коллизиях. Действуйте так, как будто их никогда не бывает. Даже тот, кто стремится найти коллизию, не найдет ее путем перебора до конца света.   -  person Pascal Cuoq    schedule 04.01.2010
comment
вы переоцениваете слабые стороны. Для MD5 известны атаки с коллизией, но пока нет известных полезных атак с использованием прообраза. cs.cmu.edu/~perspectives/md5.html Любой, кто использует Стандартный инструмент или алгоритм должны знать свои сильные и слабые стороны.   -  person Jason S    schedule 04.01.2010
comment
Если вам нужна хеш-функция, хеш-функции серии SHA-2 (SHA-224, SHA-256, SHA-384, SHA-512) по-прежнему защищены от атак и столкновений с прообразами. SHA-1 и MD5 следует использовать только для устаревших приложений, а не для новых.   -  person intgr    schedule 30.04.2012
comment
mscs.dal.ca/~selinger/md5collision   -  person Nicolas Thery    schedule 19.03.2014


Ответы (3)


Обновлять

По иронии судьбы, через несколько недель после того, как я опубликовал предыдущий ответ, два китайских исследователя, Тао Се и Дэнгуо Фэн, опубликовали новый одноблочная коллизия для MD5. До сих пор я не знал об этой статье. Один блок MD5 означает, что размер ввода составляет 64 байта или 512 бит. Обратите внимание, что входные данные в основном одинаковы, отличаются только 2 битами.

Их методология не будет опубликована до января 2013 года, но их коллизию можно проверить сейчас, используя цифры из статьи:

>>> from array import array
>>> from hashlib import md5
>>> input1 = array('I',  [0x6165300e,0x87a79a55,0xf7c60bd0,0x34febd0b,0x6503cf04,
    0x854f709e,0xfb0fc034,0x874c9c65,0x2f94cc40,0x15a12deb,0x5c15f4a3,0x490786bb,
    0x6d658673,0xa4341f7d,0x8fd75920,0xefd18d5a])
>>> input2 = array('I', [x^y for x,y in zip(input1,
    [0, 0, 0, 0, 0, 1<<10, 0, 0, 0, 0, 1<<31, 0, 0, 0, 0, 0])])
>>> input1 == input2
False
>>> md5(input1).hexdigest()
'cee9a457e790cf20d4bdaa6d69f01e41'
>>> md5(input2).hexdigest()
'cee9a457e790cf20d4bdaa6d69f01e41'

Обновление: статья была опубликована в марте 2013 г .: Тао Се и Фанбао Лю и Дэнго Фэн - Fast Collision Attack на MD5

Однако, если у вас есть больше места для игры, столкновения в несколько килобайт вычисляются НАМНОГО быстрее - их можно рассчитать в течение нескольких часов на ЛЮБОМ обычном компьютере.

Старый ответ

Предыдущая самая короткая коллизия использовала как минимум два входных блока MD5 - это 128 байтов, 1024 бит. Префикс в первом блоке может быть выбран злоумышленником произвольно, остальные будут вычислены и отображаться как тарабарщина.

Вот пример двух разных сталкивающихся входов, вы можете попробовать это сами на Python:

>>> from binascii import unhexlify
>>> from hashlib import md5
>>> input1 = 'Oded Goldreich\nOded Goldreich\nOded Goldreich\nOded Go' + unhexlify(
... 'd8050d0019bb9318924caa96dce35cb835b349e144e98c50c22cf461244a4064bf1afaecc582'
... '0d428ad38d6bec89a5ad51e29063dd79b16cf67c12978647f5af123de3acf844085cd025b956')
>>> len(input1)
128
>>> md5(input1).hexdigest()
'd320b6433d8ebc1ac65711705721c2e1'
>>> input2 = 'Neal Koblitz\nNeal Koblitz\nNeal Koblitz\nNeal Koblitz\n' + unhexlify(
... '75b80e0035f3d2c909af1baddce35cb835b349e144e88c50c22cf461244a40e4bf1afaecc582'
... '0d428ad38d6bec89a5ad51e29063dd79b16cf6fc11978647f5af123de3acf84408dcd025b956')
>>> md5(input2).hexdigest()
'd320b6433d8ebc1ac65711705721c2e1'

Создание этих двух конкретных входных данных заняло 2 дня в кластере Playstation 3 с 215 узлами, Марк Стивенс :)

person intgr    schedule 06.12.2010
comment
215 PS3 работает уже 2 дня, очень интересный факт! - person jondinham; 29.04.2012
comment
Прошел январь 2013 года. Не могли бы вы отредактировать этот отличный ответ, добавив ссылку на методологию Тао Се и Дэнго Фэна? - person Mathias Bynens; 28.05.2013
comment
Fwiw, я только что проверил этот пример сталкивающихся входов, используя стандартную реализацию MD5 Java JRE 7. - person barfuin; 21.06.2013
comment
Это интересная информация, но я вообще не понимаю, как она отвечает на вопрос. Как ответил Джейсон С., вполне вероятно, что есть коллизии в пределах 9 байтов (~ 11 печатных символов). Эти строки, конечно, не будут связаны между собой. Это сильно отличается от исследования, которое показывает, как два очень похожих блока 512-бит производят один и тот же хэш (что, как я уже сказал, все еще интересно). - person Nicole; 17.05.2014

Математика парадокса дня рождения делает точку перегиба вероятности столкновения примерно около sqrt (N), где N - количество отдельных ячеек в хеш-функции, поэтому для 128-битного хеша, когда вы получаете около 64 бит, у вас умеренная вероятность иметь 1 коллизию. Таким образом, я предполагаю, что для полного набора из 8-байтовых строк это скорее всего будет коллизия, а для 9-байтовых строк это очень вероятно.

edit: предполагается, что алгоритм хеширования MD5 вызывает сопоставление входной байтовой строки с выходным хешем, близкое к "случайному". (по сравнению с тем, который распределяет строки более равномерно среди набора возможных хешей, и в этом случае он будет ближе к 16 байтам.)

Также для получения более конкретного числового ответа, если вы посмотрите одно из приближений для расчета столкновения вероятность, вы получите

p (k) 1 - e -k (k-1) / (2 * 2 128), где k = размер пространства возможных входов = 2 m, где длина входной байтовой строки составляет m бит.

набор из 8-ми байтовых строк: p (2 64) 1 - e -0,5 0,3935

набор из 9 байтовых строк: p (2 72) 1 - e -2 144 / (2 * 2 128) < / sup> = 1 - e -2 15 = 1 - e -32768 1

Также обратите внимание, что они предполагают полный набор строк байтов m / 8. Если вы используете только буквенно-цифровые символы, вам понадобится больше байтов, чтобы получить вероятную коллизию.

person Jason S    schedule 04.01.2010
comment
Столкновения - это просто математический факт, когда вы сопоставляете бесконечное множество с набором 128-битных чисел. Разработчики, предполагающие уникальность хэша, являются отличным источником ошибок WTF. CCP писала об ошибке в блоге (хотя они использовали 32-битный хеш) eveonline.com/ devblog.asp? a = blog & bid = 371 - person Ken Fox; 04.01.2010
comment
Мне нравится это объяснение. Похоже, что первая коллизия, вероятно, произойдет в пределах 8 или 9 байтов, и, как отмечали другие, если строки короче, чем это, то, вероятно, в любом случае их не стоит хэшировать. - person Alf Eaton; 04.01.2010
comment
@KenFox Совершенно нормально, если у хеш-функции нет коллизий. Они, очевидно, существуют, но для хороших криптографических хэшей (скажем, SHA-256) шансы когда-либо столкнуться с одним из них меньше, чем вероятность случайных аппаратных ошибок. - person CodesInChaos; 09.02.2013
comment
around sqrt(N), where N is the number of distinct bins in the hash function, so for a 128-bit hash, as you get around 64 bits you are moderately likely to have 1 collision Я запуталась .. откуда 64 взялась ?? - person Dan Bechard; 24.06.2014
comment
2 ^ 64 - это квадратный корень из 2 ^ 128. - person Jason S; 24.06.2014

Я сомневаюсь, что есть какая-то полезная длина, на которой у вас не будет возможных столкновений. Эти алгоритмы на самом деле не используются для этой цели. Он призван быть уникальным для небольших изменений в данных (например, поврежденных файлов), а не для всех возможных наборов данных.

person Mike Nelson    schedule 04.01.2010
comment
Совершенно неправильно, MD5 - это криптографическая хеш-функция. Криптографические хеш-функции устойчивы к коллизиям. Некоторое время MD5 считался устойчивым к столкновениям, пока в 2004 году не были обнаружены слабые места. - person intgr; 07.12.2010
comment
@intgr На самом деле это правильно, а не уникально для всех возможных наборов данных. Хэш SHA-256 по своей природе имеет 2 ^ 256 возможных значений. Он представлен 64-значной шестнадцатеричной строкой. Это означает, что требуется не более 65 шестнадцатеричных цифр, чтобы найти хэши, дублированные в наборе всех возможных 64-значных шестнадцатеричных строк. Он также может быть представлен 43 буквенно-цифровыми (их 62) символами (256 / log2(62)), что означает, что все перестановки буквенно-цифровых строк из 43 символов будут хешированы для всех возможных хэшей SHA-256, включая по одному для каждой более длинной строки. - person Nicole; 17.05.2014