32

Согласно этой статье и многим другим, SHA-1 не является безопасным.

В моем случае меня не волнуют пароли или цифровые сертификаты. Я обеспокоен целостностью файлов.

Разумно ли возможно, чтобы файл (например, образ ISO или исполняемый файл) был злонамеренно изменен таким образом, чтобы:

  • Поддерживает хэш исходного файла SHA-1 и
  • Поддерживает все содержимое файла и его работу (но, конечно, теперь включает вредоносный контент, которого изначально там не было)

На мой взгляд, изменение файла таким образом, что это приводит к коллизии SHA-1, сделает файл совершенно бесполезным. ISO был бы полностью поврежден, или исполняемый файл был бы настолько зашифрован, что даже не был бы исполняемым файлом.

Но, как я вижу, это может быть неправильно. До сих пор я ничего не нашел в поиске Google в отношении постоянной пригодности SHA-1 для проверки файлов. Есть идеи?

8 ответов8

41

Никто еще не достиг этого для SHA-1. Это возможно в теории, но все еще не практично. Отчеты о небезопасности в SHA-1 просто означают, что уровень безопасности не так высок, как нам хотелось бы, и это означает, что у нас не так много лет, чтобы думать об этом, как мы думали.

Труднее создать файл с тем же хешем SHA-1, что и данный файл, чем создать два файла самостоятельно с одним и тем же хешем SHA-1. И, насколько нам известно, никто в мире еще не выполнил даже эту более легкую задачу. Это не значит, что завтра этого не произойдет.

26

Это теоретически возможно, но это еще не сделано.

То, что вы ищете, называется «коллизия хешей»: два файла с одинаковым хешем. Криптографические хэш-коды, такие как SHA-1, обычно предназначены для того, чтобы сделать это трудным. Поскольку SHA-1 является 160-битным кодом, в среднем потребуется 2 ^ 159 попыток перебора, чтобы найти дубликат. Если найден алгоритм, который надежно работает лучше, чем алгоритм против криптографического хэша, хеш считается «сломанным».

MD-5 - пример очень сломанного хэша. Он должен был иметь прочность 128 бит, что требовало в среднем 2 ^ 127 попыток. Как и в случае злоупотребления известными уязвимостями, фактическое количество попыток может достигать 2 ^ 47. Это много меньше, чем 2 ^ 127. Фактически, это было сделано менее чем за один день на современном вычислительном кластере.

Я привожу этот пример, потому что это наиболее близко к тому, как вы собираетесь использовать SHA-1. Тем не менее, это не самый распространенный подход криптоанализа для проверки того, что хэши не сломаны. Как правило, они допускают конфликт между двумя файлами, выбранными злоумышленником, вместо того, чтобы вы выбирали один файл и злоумышленник пытался сопоставить его. Преимущество такого рода атак состоит в том, что их легче сравнивать. Если я нахожу, что "тяжело" взломать ваш файл, значит ли это, что другой файл такой же сильный? Эта атака, при которой злоумышленник выбирает оба файла, гарантирует, что мы поймаем худшее из худшего.

Этот тип атаки позволяет использовать интересный трюк, известный как « атака на день рождения ». Короче говоря, использование атаки на день рождения вдвое уменьшает силу алгоритма, поэтому SHA-1 требует в среднем 2 ^ 80 попыток, а MD5 требует в среднем 2 ^ 64 попыток. Это половина из 160 и 128 соответственно.

SHA-1 имеет известные атаки, которые уменьшают свою силу с 2 ^ 80 до 2 ^ 69. Это не будет иметь большого значения для вас. 2 ^ 69 попыток это долго .

Однако из истории мы обнаружили, что алгоритмы хеширования не нарушаются самопроизвольно, а скорее нарушаются со временем. Никто не взломает алгоритм, подобный MD-5, взяв его с 2 ^ 64 до 2 ^ 47 за ночь. Это происходит со временем, так как многие люди публикуют статьи о математике, которую они используют против нее. Обычно можно наблюдать, как сложность атак медленно снижается с самого начала алгоритма (где лучшая атака обычно - атака на день рождения).

Тот факт, что мы видим некоторые изменения в столкновениях, предполагает, что SHA-1 видит свет в конце туннеля. Он по-прежнему силен, но может возникнуть желание перейти на новейший SHA-3, который в настоящее время намного безопаснее.

Вы должны действительно принимать такие решения с точки зрения модели угроз. Сколько урона может нанести атакующий, если он получит одно из этих столкновений. Являются ли ваши злоумышленники сценаристами, имеющими доступ к нескольким ноутбукам, или правительствами, располагающими целыми суперкомпьютерными кластерами? Насколько велико временное окно, злоумышленник должен взломать хеш, прежде чем он не будет использоваться (многие виды криптографии включают «смену защиты», например, смену пароля). Все это повлияет на то, насколько серьезно вы должны учитывать столкновения.

8

Недостатки в SHA-1, обсуждаемые в этой статье, очень специфичны: они позволяют злоумышленникам создавать две вещи, которые хэшируют одно и то же значение (это называется "атака столкновением"). Тем не менее, атака столкновения требует, чтобы злоумышленник контролировал оба файла. Если злоумышленник не контролирует исходный файл, атака столкновением не позволяет ему найти другой файл с таким же значением хеш-функции.

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

Для файлов такая же ситуация не всегда применима. Если вы обеспокоены тем, что создатель файла является злоумышленником (например, он получит одну вещь независимо проверенную как хорошую, а затем отправит вам вредоносную информацию с тем же хешем), применяется атака SHA-1, и вы должны посмотреть к постепенному отказу от этого (хотя это еще не критично, как упоминал Дэвид Шварц). Если исходный файл является доверенным, то злоумышленник не может применить известные на данный момент атаки SHA-1, хотя вам все равно следует подумать о его поэтапном отказе, если можете (если у вас есть выбор, используйте хэш без известных атак, таких как SHA- 2).


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


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

5

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

SHA-1 сломан, поскольку атака столкновением может быть осуществлена в 2 52 операциях согласно статье в Википедии, в которой не приводится цитата для этого числа (лучшая атака, которую я знаю, которая на самом деле заслуживает доверия, - это атака Марка Стивенса , что занимает 2 60 операций). Но давайте предположим пессимистический случай 2 52.

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

Теперь у атаки с прообразом показатель экспоненты в два раза больше, так что если предположить, что атака столкновением равна 2 52 , то это будет 2 104 операции, что является совершенно другой стадией.

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

Выполнение такого масштабного расчета потребовало бы источника энергии, который намного больше, чем все, что мы можем себе позволить посвятить одной операции. Нет, не совсем источник энергии размером с солнце, но все же довольно большой.

Вы можете реально ожидать получить что-нибудь от 10 до 50 GFLOPS из одного ватта. Если предположить, что происходит какое-то чудо и процессоры получают в несколько тысяч раз больше энергии за ночь, можно предположить, что 1 SHA ≈ 1 FLOP (довольно оптимистично!). Это будет означать, что для выполнения 2 104 вычислений хеш-функции в течение 10 лет вам потребуется электростанция мощностью 10 12 Вт. Чтобы запустить атаку в течение 1 года, вам нужна электростанция мощностью 10 13 Вт. Это примерно в 50 раз больше, чем все атомные электростанции США, Франции и Японии могут производить вместе, только для создания единого хэша.

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

2

Общий смысл статьи, о которой идет речь в этом вопросе: SHA1 устарела и должна быть прекращена, пока у вас еще есть время, чтобы сделать это гладко. В некоторых областях время истекает, поскольку Google и Microsoft соблюдают крайние сроки.

Практическое правило для устаревшей технологии:

  • Если вы делаете новый дизайн или добавляете функции, не используйте его (SHA1).
  • Если вы поддерживаете что-то старое, составьте план, когда его заменить (SHA1).

Краткая цитата из сообщения в блоге 2012 года Брюса Шнайера:«Дело в том, что мы в сообществе должны начать переход от SHA-1 к SHA-2/SHA-3 сейчас».

2

В части вашего вопроса о столкновении хэшей SHA-1 на этот вопрос ответили несколько ответов.

Однако большая часть этого зависит от типа файла, с которым мы работаем:

Поддерживает общее содержимое файла и его работу (но, конечно, теперь включает вредоносный контент, который изначально не был изменен)

Что это означает, сильно зависит от того, что обнаруживает изменения:

  • Если это подписанный исполняемый файл, то нет (разумного) шанса: вам нужно каким-то образом получить два коллизии хеша: SHA-1 файла и внутреннюю подпись .exe.
  • Если это неподписанный исполняемый файл, .com, unsigned .dll или аналогичный, их ветки ресурсов можно добавлять способами, которые не изменят их работу, и, таким образом, можно (в конце концов) получить коллизию хеша, которая не обнаруживается «обычным» операция.
  • Если это файл исходного кода или аналогичная структура (.cs, .c, .h, .cpp, .rb, .yml, .config, .xml, .pl, .bat, .ini), то дополнения, модификации или удаления может быть ограничен допустимым синтаксисом комментария, так что изменение не будет заметно в большинстве случаев (его компиляция или запуск, а не открытие в текстовом редакторе).
  • Если это формат .iso или .zip или другой контейнер, это также маловероятно, так как большинство случайных изменений повредит контейнер. Это можно сделать: добавить фиктивную запись файла или изменить содержимое в контейнере и перепроверить его, но вы добавляете уровень сложности и добавляете дополнительное время для проверки результата, а также ограниченные степени свободы в отношении как и какое содержимое может быть изменено.
  • Если это текстовый или подобный тексту формат, их можно изменить практически любым способом, оставаясь при этом «действительным» файлом, хотя его содержание, вероятно, будет заметно.
  • Со многими форматами, такими как .rtf, .doc, .html, .xslx и другими форматами, поддерживающими разметку, они могут быть добавлены или изменены способами, которые не будут обнаруживаться синтаксическими анализаторами, за исключением длины (или даже с ограниченной длиной) (меньше свободы) файлы могут быть изменены, чтобы (в конечном итоге) получить коллизию хеша, оставаясь при этом не только допустимым файлом, но и не заметно изменяемым любым способом, который будет виден типичным приложениям, с которыми они будут использоваться.

Итак, что вам осталось, так это как получить столкновения в любой структуре, которая не разрушается и, возможно, в некоторой степени необнаружима:

  1. Внесите любые необходимые функциональные изменения (возможно, вставку вредоносного содержимого) и внесите любые дополнительные изменения, чтобы сохранить конкретный формат файла.
  2. Добавьте раздел, который будет не функционировать (между блоками комментариев, в самом конце текстового файла с возвратом каретки 3k, изолировать текущий блок комментариев)
  3. Добавьте или выберите символ / кодовую точку / байт для модификации и попробуйте все возможные допустимые комбинации (например, не каждая комбинация байтов действительна для разных кодировок).
  4. Пересчитайте хэш, посмотрите, совпадает ли столкновение.
  5. если нет, переходите к 3.

Допустим, у вас есть сверхбыстрый компьютер и небольшой файл, такой, что модификация с допустимой последовательностью байтов и повторным вычислением хэша занимает 1 миллисекунду (вероятно, требуется некоторое выделенное оборудование). Если распределение хеша является совершенно случайным и распределяется по всему диапазону, вы будете сталкиваться с SHA-1 каждые 2^160 попыток (грубое форсирование).

2^160/1000/60/60/24/365.24 
= 4.63x10^37 years 
= 46,300,000,000,000,000,000,000,000,000,000,000,000 years 
= 46 undecillion years.

Но давайте попробуем версии 2^60 и 2^52 и притворимся, что они позволяют нам изменять файл так, как нам нравится (они этого не делают), и что их тоже можно сделать за 1 мс при каждой попытке:

2^52 yields 142,714 years 
/*humans might still be around to care, but not about these antiquated formats*/
2^60 yields 3.65x10^7 years = 36,500,000 years 
/*machines will probably have taken over anyway*/

Но, может, тебе повезет. Действительно, на самом деле, чудеса «больше чудо, чем все, что люди называют», счастливчики.

0

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

-6

Да, это возможно. Подумайте, как работают вирусы на EXE-файлах. Полезная нагрузка вредоносного ПО добавляется к исходному EXE-файлу, так что программа все еще делает то, что делала изначально, но также распространяется как вирус. Теперь, чтобы сохранить тот же хэш, вам понадобится дополнительный специально созданный отступ.

Это означает, что файл будет больше. Но в случае EXE, возможно, вы могли бы удалить часть менее используемого кода, чтобы программа работала только изначально. В случае JPEG, вы можете сжать изображение дальше или использовать другое изображение полностью. Для ISO вы можете удалить наборы файлов. Вычисления, требуемые для репликации хэша, будут более сложными и, возможно, математически невозможными для конкретных случаев, но все же будут возможны в целом.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .