Ответ 1
Первое известное столкновение теперь опубликовано в https://shattered.it/
Этот вопрос похож на этот, но он ссылается только на демки столкновения MD5.
Существуют ли какие-либо фактические пары столкновений SHA1 известных сообщений до сих пор?
Я хотел бы использовать их, чтобы проверить, как с этим справляются различные программные продукты (мои собственные и некоторые сторонние).
Выполнение некоторых поисковых запросов Google только показало ошеломительные столкновения MD5/SHA0 и некоторые намеки на подход к созданию SHA1-коллизий, но я не мог получить какие-либо примеры.
Первое известное столкновение теперь опубликовано в https://shattered.it/
По состоянию на 23 февраля 2017 года этот ответ больше не является точным.
Пока неизвестно, что произошло с SHA-1. Прямо сейчас:
Было предпринято попытку получить столкновение SHA-1, используя силу от тех, у кого были некоторые запасные тактовые циклы CPU для пожертвования, с BOINC, чтобы организовать все это, но волонтеров было недостаточно, и в прошлом году усилия были отменены. Следовательно, никакого фактического столкновения SHA-1 пока нет.
Теоретические атаки основаны на некоторых предположениях, которые могут оказаться слегка ложными; например, атака на MD5 на самом деле немного быстрее, чем ожидалось (в какой-то момент есть свойство, которое должно быть выполнено с теоретической вероятностью 2 -28 но на практике это больше похоже на 2 -27.7 т.е. атака на 20% быстрее, чем прогнозировалось). По-прежнему считается, что теоретическая атака верна и сложность "довольно точная".
Блог безопасности Google описывает первый публичный, преднамеренный конфликт SHA-1 здесь: https://security.googleblog.com/2017/02/announcing-first-sha1-collision.html
Прямые ссылки на 2 PDF файла с тем же SHA-1 (с сайта посвященного этому обнаружению):
Опять же, Марк Стивенс участвовал вместе с CWI Amsterdam и некоторыми сотрудниками Google, но на этот раз для полномасштабного SHA-1 на двух построенных PDF файлах.
Стивенс также отмечает, что из-за SHA-1 Merkle- Damgård construction, оба двух PDF файла могут быть расширены (добавлены) с теми же произвольными данными, что и для хэширования более длинных версий для одного и того же дайджеста.
Google, по всей видимости, опубликует сопутствующий исходный код через 90 дней (23 февраля 2017 года), дав поставщикам системного ПО некоторое время обновлять свои материалы.
Остается посмотреть, как справится с этим ПО, например, git и поставщики услуг, такие как GitHub, особенно с точки зрения обратной совместимости.
Линус Торвальдс опубликовал выражение о git, отметив, что они будут переноситься на новые хэши совместимым способом, но это потребуется время.
Кстати, "разрушенная" демонстрация столкновения не влияет на git (без изменений), потому что она использует SHA-1 следующим образом:
sha1("blob " + <size in octets as text> + "\0" + <contents>)
Вы можете получить хэш git с помощью git hash-object <file path>
, даже если файл не находится в git.
В связанные новости, Subversion кажется первой настоящей жертвой этого доказательства, вызывая повреждение репозитория, тем самым делая указанные файлы практическими эксплойтами.
- ПРЕДЫДУЩАЯ... -
A 76-раундное столкновение было найдено Марк Стивенс.
Криптограф Жан-Филипп Аумассон, соавтор BLAKE и SipHash и инициатором Конкурс хищения пароля (PHC), догадывается о столкновении SHA-1 в полном объеме 80 раундов будет найдено к 2020 году.
Согласно текущие исследования Марка Стивенса и др. опубликованном в октябре 2015 г.,
... мы оцениваем стоимость столкновений SHA-1 сегодня (т.е. падение 2015) между 75K $и 120K $ арендуя облачные вычисления Amazon EC2 в течение нескольких месяцев. Напротив, эксперт по вопросам безопасности Брюс Шнайер ранее Стоимость столкновения SHA-1 составит ~ 173 тыс. Долл. США к 2018 году.
Они также описывают атаку столкновения для функции сжатия SHA-1.
Существует пример в столкновении с поиском на SHA1 от Wang, Yin and Yu, с 2005 года, но только для ослабления, 58 -ограниченная версия SHA-1. (Полный, официальный SHA-1 выполняет 80 раундов.)
3 A collision example for 58-step SHA1
h₁ = compress(h₀,M₀) = compress(h₀,M'₀)
_____________________________________________________
h₀: 67452301 efcdab89 98badcfe 10325476 c3d2e1f0
_____________________________________________________
M₀: 132b5ab6 a115775f 5bfddd6b 4dc470eb
0637938a 6cceb733 0c86a386 68080139
534047a4 a42fc29a 06085121 a3131f73
ad5da5cf 13375402 40bdc7c2 d5a839e2
_____________________________________________________
M'₀: 332b5ab6 c115776d 3bfddd28 6dc470ab
e63793c8 0cceb731 8c86a387 68080119
534047a7 e42fc2c8 46085161 43131f21
0d5da5cf 93375442 60bdc7c3 f5a83982
_____________________________________________________
h₁: 9768e739 b662af82 a0137d3e 918747cf c8ceb7d4
_____________________________________________________
Table 2: A collision of SHA1 reduced to 58 steps. The two
messages that collide are M₀ and M'₀. Note that padding
rules were not applied to the messages.
Не точно столкновение SHA1, но есть столкновение PBKDF2-HMAC-SHA1 код аутентификации дайджеста.
Например, PBKDF2 (SHA1, пароль, соль, итерации, dkLen) двух паролей plnlrtfpijpuhqylxbgqiiyipieyxvfsavzgxbbcfusqkozwpngsyejqlmjsytrmd
и eBkXQTfuBqp\'cTcar&g*
, солей hunter2
, 4
итераций, обеспечивают одинаковое значение (35d1c8f259129dc800ec8e073bb68f995424619c
для dkLen 20
).
На самом деле тривиально найти такие столкновения для строк длиной более 64 байтов.
Другой пример столкновения (Python3):
>>> import hashlib, binascii
>>> def pbkdf2sha1hex(x, salt, iters):
... h = hashlib.pbkdf2_hmac('sha1', x, salt, iters)
... return binascii.hexlify(h)
>>> pbkdf2sha1hex(b'http://stackoverflow.com/info/3475648/sha1-collision-demo-example/31136714', b'NaCl', 1000000)
b'20177527e04e05d5e7b448c1ab2b872f86831d0b'
>>> pbkdf2sha1hex(b'\x8c\xbf8\x94\xbc\xf4\xbe\x90xT,r\xbc\x03\xd1\xed\xd9\xea\xfb\x9f', b'NaCl', 1000000)
b'20177527e04e05d5e7b448c1ab2b872f86831d0b'
Обратите внимание, что одна и та же "проблема" относится к PBKDF2-HMAC-SHA256:
>>> h1 = pbkdf2_hmac('sha256', b'http://stackoverflow.com/info/3475648/sha1-collision-demo-example/31136714', b'NaCl', 1000000)
b"\xcf\xc5\xee\x15=\r\x0b\x0e\x89r\x9b\xe1\xb7'+\xa4'o\x98kn++u\x12\xec\xd9\xec\xea\xebL\xb7"
>>> h2 = pbkdf2_hmac('sha256', b'.\x83\xb0D\x93D\x9f\x162\xf3\xd4x\xb6\x1a\x9f-\x1f\xdb\xdc\xa4\x8f\xb3\x95Y5\xea\x99*\x97\x00V\x81', b'NaCl', 1000000)
>>> h1 == h2
True
Все происходит, потому что из определения PBKDF2 для длинных строк оно хранится: PBKDF2(hashalgo, s, ...) == PBKDF2(hashalgo, hashalgo(s), ...)
.
Дополнительная информация, например. здесь: https://mathiasbynens.be/notes/pbkdf2-hmac