В криптографии SHA-1 ( Secure Hash Algorithm 1 ) — это хеш-функция , которая принимает входные данные и выдает 160- битное (20- байтовое ) хеш-значение, известное как дайджест сообщения — обычно отображаемое как 40 шестнадцатеричных цифр. Он был разработан Агентством национальной безопасности США и является Федеральным стандартом обработки информации США . [3] Алгоритм был криптографически взломан [4] [5] [6] [7] [8] [9] [10] , но все еще широко используется.
С 2005 года SHA-1 не считался безопасным против хорошо финансируемых оппонентов; [11] по состоянию на 2010 год многие организации рекомендовали его замену. [12] [10] [13] NIST официально запретил использование SHA-1 в 2011 году и запретил его использование для цифровых подписей в 2013 году, а также заявил, что он должен быть прекращен к 2030 году. [14] По состоянию на 2020 год [обновлять]атаки с выбранным префиксом против SHA-1 являются практичными. [6] [8] Таким образом, рекомендуется как можно скорее удалить SHA-1 из продуктов и вместо этого использовать SHA-2 или SHA-3 . Замена SHA-1 является неотложной там, где он используется для цифровых подписей .
Все основные поставщики веб-браузеров прекратили принимать сертификаты SSL SHA-1 в 2017 году. [15] [9] [4] В феврале 2017 года CWI Amsterdam и Google объявили, что провели атаку на коллизию SHA-1, опубликовав два разных файла PDF, которые создали одинаковый хэш SHA-1. [16] [2] Однако SHA-1 по-прежнему безопасен для HMAC . [17]
Microsoft прекратила поддержку подписи кода SHA-1 для Центра обновления Windows 3 августа 2020 года [18] , что также фактически прекратило работу серверов обновлений для версий Windows , которые не были обновлены до SHA-2, таких как Windows 2000 вплоть до Vista , а также версии Windows Server от Windows 2000 Server до Server 2003 .
SHA-1 создает хэш-код сообщения на основе принципов, аналогичных тем, которые использовал Рональд Л. Ривест из Массачусетского технологического института при разработке алгоритмов хэш-кода сообщения MD2 , MD4 и MD5 , но генерирует большее значение хэш-функции (160 бит против 128 бит).
SHA-1 был разработан в рамках проекта правительства США Capstone . [19] Первоначальная спецификация алгоритма была опубликована в 1993 году под названием Secure Hash Standard , FIPS PUB 180, агентством по стандартам правительства США NIST (Национальный институт стандартов и технологий). [20] [21] Эта версия теперь часто называется SHA-0 . Она была отозвана АНБ вскоре после публикации и была заменена пересмотренной версией, опубликованной в 1995 году в FIPS PUB 180-1 и обычно обозначаемой SHA-1 . SHA-1 отличается от SHA-0 только одним побитовым вращением в графике сообщений его функции сжатия . По данным АНБ, это было сделано для исправления недостатка в исходном алгоритме, который снижал его криптографическую безопасность, но они не предоставили никаких дополнительных объяснений. [22] [23] Публично доступные методы действительно продемонстрировали компрометацию SHA-0 в 2004 году, до SHA-1 в 2017 году ( см. §Атаки ).
SHA-1 является частью нескольких широко используемых приложений и протоколов безопасности, включая TLS и SSL , PGP , SSH , S/MIME и IPsec . Эти приложения также могут использовать MD5 ; как MD5 , так и SHA-1 произошли от MD4 .
SHA-1 и SHA-2 — это алгоритмы хэширования, требуемые законом для использования в некоторых приложениях правительства США , включая использование в других криптографических алгоритмах и протоколах, для защиты конфиденциальной несекретной информации. FIPS PUB 180-1 также поощрял принятие и использование SHA-1 частными и коммерческими организациями. SHA-1 изымается из большинства правительственных приложений; Национальный институт стандартов и технологий США заявил: «Федеральные агентства должны прекратить использование SHA-1 для... приложений, требующих устойчивости к коллизиям, как только это станет практически возможным, и должны использовать семейство хэш-функций SHA-2 для этих приложений после 2010 года» [24] , хотя позже это было смягчено, чтобы разрешить использование SHA-1 для проверки старых цифровых подписей и временных меток. [24]
Основной мотивацией публикации алгоритма безопасного хэширования стал Стандарт цифровой подписи , в который он включен.
Хэш-функции SHA легли в основу блочных шифров SHACAL .
Системы контроля версий, такие как Git , Mercurial и Monotone, используют SHA-1 не для безопасности, а для идентификации версий и обеспечения того, чтобы данные не изменились из-за случайного повреждения. Линус Торвальдс сказал о Git в 2007 году:
Однако Git не требует устойчивости ко второму прообразу SHA-1 в качестве функции безопасности, поскольку он всегда предпочитает сохранять самую раннюю версию объекта в случае коллизии, не давая злоумышленнику тайно перезаписывать файлы. [26] Известные атаки (по состоянию на 2020 год) также не нарушают устойчивость ко второму прообразу. [27]
Для хэш-функции, для которой L — это количество бит в дайджесте сообщения, нахождение сообщения, соответствующего данному дайджесту сообщения, всегда можно выполнить с помощью поиска методом грубой силы примерно за 2 L оценок. Это называется атакой на прообраз и может быть или не быть практичным в зависимости от L и конкретной вычислительной среды. Однако коллизия , состоящая из нахождения двух разных сообщений, которые производят один и тот же дайджест сообщения, требует в среднем всего около 1,2 × 2 L /2 оценок с использованием атаки на день рождения . Таким образом, стойкость хэш-функции обычно сравнивают с симметричным шифром длиной в половину дайджеста сообщения. SHA-1, который имеет 160-битный дайджест сообщения, изначально считался имеющим 80-битную стойкость.
Некоторые приложения, использующие криптографические хэши, например, хранилища паролей, лишь в минимальной степени подвержены атаке столкновений. Создание пароля, который работает для данной учетной записи, требует атаки прообраза , а также доступа к хэшу исходного пароля, что может быть или не быть тривиальным. Обратное шифрование пароля (например, для получения пароля для попытки взломать учетную запись пользователя в другом месте) не становится возможным из-за атак. Однако даже безопасный хэш пароля не может предотвратить атаки методом подбора на слабые пароли . См. Взлом пароля .
В случае подписания документа злоумышленник не мог просто подделать подпись существующего документа: злоумышленнику пришлось бы создать пару документов, один безобидный и один вредоносный, и заставить владельца закрытого ключа подписать безобидный документ. Существуют практические обстоятельства, в которых это возможно; до конца 2008 года можно было создавать поддельные SSL- сертификаты с использованием коллизии MD5 . [28]
Из-за блочной и итеративной структуры алгоритмов и отсутствия дополнительных конечных шагов все функции SHA (кроме SHA-3) [29] уязвимы для атак с расширением длины и частичным столкновением сообщений. [30] Эти атаки позволяют злоумышленнику подделать сообщение, подписанное только ключевым хешем – SHA( message || key ) или SHA( key || message ) – путем расширения сообщения и пересчета хеша без знания ключа. Простым улучшением для предотвращения этих атак является хеширование дважды: SHA d ( message ) = SHA(SHA(0 b || message )) (длина 0 b , нулевого блока, равна размеру блока хеш-функции).
На конференции CRYPTO 98 два французских исследователя, Флоран Шабо и Антуан Жу , представили атаку на SHA-0: коллизии могут быть найдены со сложностью 2 61 , что меньше, чем 2 80 для идеальной хеш-функции того же размера. [31]
В 2004 году Бихам и Чен обнаружили почти коллизии для SHA-0 – два сообщения, которые хэшируются почти до одинакового значения; в этом случае 142 из 160 бит равны. Они также обнаружили, что полные коллизии SHA-0 сократились до 62 из 80 раундов. [32]
Впоследствии, 12 августа 2004 года, Жу, Каррибо, Лемюэ и Жальби объявили о коллизии для полного алгоритма SHA-0. Это было сделано с использованием обобщения атаки Шабо и Жу. Нахождение коллизии имело сложность 2 51 и заняло около 80 000 процессоро-часов на суперкомпьютере с 256 процессорами Itanium 2 (что эквивалентно 13 дням постоянного использования компьютера).
17 августа 2004 года на сессии Rump конференции CRYPTO 2004 предварительные результаты были объявлены Ваном , Фэном, Лаем и Юем об атаке на MD5 , SHA-0 и другие хэш-функции. Сложность их атаки на SHA-0 составляет 2 40 , что значительно лучше, чем у атаки Жу и др. [33] [34]
В феврале 2005 года было объявлено об атаке Сяоюнь Вана , Ицюнь Лизы Инь и Хунбо Юя, которая смогла найти коллизии в SHA-0 в 239 операциях . [5] [35]
Другая атака 2008 года с применением атаки «бумеранг» снизила сложность поиска коллизий до 2 33,6 , что, по оценкам, заняло бы 1 час на среднем ПК в 2008 году. [36]
В свете результатов SHA-0 некоторые эксперты [ кто? ] предположили, что планы по использованию SHA-1 в новых криптосистемах следует пересмотреть. После публикации результатов CRYPTO 2004 NIST объявил, что они планируют отказаться от использования SHA-1 к 2010 году в пользу вариантов SHA-2. [37]
В начале 2005 года Винсент Реймен и Элизабет Освальд опубликовали атаку на сокращенную версию SHA-1 – 53 из 80 раундов – которая находит коллизии с вычислительными затратами менее 2,80 операций . [38]
В феврале 2005 года было объявлено об атаке, предпринятой Сяоюнь Ваном , Ицюнь Лизой Инь и Хунбо Юем. [5] Атаки могут находить коллизии в полной версии SHA-1, требуя менее 2,69 операций . ( Для поиска методом перебора потребуется 2,80 операций .)
Авторы пишут: «В частности, наш анализ построен на оригинальной дифференциальной атаке на SHA-0, атаке с близким столкновением на SHA-0, методах многоблочных столкновений, а также методах модификации сообщений, используемых в атаке поиска столкновений на MD5. Взлом SHA-1 был бы невозможен без этих мощных аналитических методов». [39] Авторы представили коллизию для 58-раундового SHA-1, найденную с помощью 2 33 хэш-операций. Статья с полным описанием атаки была опубликована в августе 2005 года на конференции CRYPTO.
В интервью Инь утверждает, что «Грубо говоря, мы используем следующие две слабости: одна из них заключается в том, что этап предварительной обработки файла недостаточно сложен; другая заключается в том, что определенные математические операции в первых 20 раундах имеют неожиданные проблемы безопасности». [40]
17 августа 2005 года на конференции CRYPTO 2005 Rump Session было объявлено об улучшении атаки SHA-1 от имени Сяоюнь Вана , Эндрю Яо и Фрэнсис Яо , что снизило сложность, необходимую для поиска коллизии в SHA-1, до 2 63 . [7] 18 декабря 2007 года подробности этого результата были объяснены и проверены Мартином Кохраном. [41]
Кристоф Де Канньер и Кристиан Рехбергер дополнительно улучшили атаку на SHA-1 в «Поиске характеристик SHA-1: общие результаты и приложения», [42] получив награду за лучшую статью на ASIACRYPT 2006. Была представлена двухблочная коллизия для 64-раундового SHA-1, найденная с использованием неоптимизированных методов с 2 35 оценками функции сжатия. Поскольку эта атака требует эквивалента около 2 35 оценок, она считается значительным теоретическим прорывом. [43] Их атака была расширена еще до 73 раундов (из 80) в 2010 году Гречниковым. [44] Однако для того, чтобы найти фактическую коллизию в полных 80 раундах хеш-функции, требуется огромное количество компьютерного времени. С этой целью 8 августа 2007 года начался поиск коллизий для SHA-1 с использованием добровольной вычислительной платформы BOINC , организованный Техническим университетом Граца . Попытка была прекращена 12 мая 2009 года из-за отсутствия прогресса. [45]
На сессии Rump конференции CRYPTO 2006 Кристиан Рехбергер и Кристоф Де Канньер заявили, что обнаружили коллизионную атаку на SHA-1, которая позволяет злоумышленнику выбрать по крайней мере части сообщения. [46] [47]
В 2008 году методология атаки Стефана Мануэля сообщила о коллизиях хэшей с предполагаемой теоретической сложностью от 2,51 до 2,57 операций . [48] Однако позже он отказался от этого заявления, обнаружив, что локальные пути коллизий на самом деле не являются независимыми, и, наконец, сослался на наиболее эффективный вектор коллизии, который был уже известен до этой работы. [49]
Кэмерон Макдональд, Филип Хоукс и Йозеф Пиепшик представили атаку коллизии хэшей с заявленной сложностью 2 52 на сессии Rump конференции Eurocrypt 2009. [50] Однако сопроводительная статья «Дифференциальный путь для SHA-1 со сложностью O (2 52 )» была отозвана из-за того, что авторы обнаружили, что их оценка была неверной. [51]
Одна из атак против SHA-1 была проведена Марком Стивенсом [52] с предполагаемой стоимостью 2,77 млн долларов (2012 г.) для взлома одного значения хэша путем аренды мощности ЦП с облачных серверов. [53] Стивенс разработал эту атаку в проекте под названием HashClash, [54] реализовав атаку дифференциального пути. 8 ноября 2010 г. он заявил, что у него есть полностью рабочая атака с почти столкновением против полного SHA-1, работающая с предполагаемой сложностью, эквивалентной 2 57,5 сжатий SHA-1. Он подсчитал, что эту атаку можно расширить до полной коллизии со сложностью около 2 61 .
8 октября 2015 года Марк Стивенс, Пьер Карпман и Томас Пейрен опубликовали атаку с коллизией свободного старта на функцию сжатия SHA-1, которая требует всего 2 57 оценок SHA-1. Это не приводит напрямую к коллизии на полной хеш-функции SHA-1 (где злоумышленник не может свободно выбирать начальное внутреннее состояние), но подрывает заявления о безопасности SHA-1. В частности, это был первый случай, когда была продемонстрирована атака на полный SHA-1 ; все предыдущие атаки были слишком дорогими для их авторов, чтобы их осуществить. Авторы назвали этот значительный прорыв в криптоанализе SHA-1 The SHAppening . [10]
Метод был основан на их более ранней работе, а также на технике ускорения вспомогательных путей (или бумерангов) от Жу и Пейрена, и с использованием высокопроизводительных/экономичных видеокарт от Nvidia . Коллизия была обнаружена на кластере из 16 узлов с общим количеством 64 видеокарт. Авторы подсчитали, что подобную коллизию можно было бы найти, купив время GPU на 2000 долларов США на EC2 . [10]
Авторы подсчитали, что стоимость аренды достаточного количества времени EC2 CPU/GPU для генерации полной коллизии для SHA-1 на момент публикации составляла от 75 тыс. до 120 тыс. долларов США, и отметили, что это вполне соответствовало бюджету преступных организаций, не говоря уже о национальных разведывательных агентствах . Таким образом, авторы рекомендовали как можно скорее прекратить поддержку SHA-1. [10]
23 февраля 2017 года CWI (Centrum Wiskunde & Informatica) и Google объявили об атаке SHAttered , в ходе которой они сгенерировали два разных PDF-файла с одинаковым хешем SHA-1 примерно за 2 63,1 оценки SHA-1. Эта атака примерно в 100 000 раз быстрее, чем подбор методом подбора коллизии SHA-1 с атакой на день рождения , которая, по оценкам, заняла 2 80 оценок SHA-1. Для атаки потребовалась «вычислительная мощность, эквивалентная 6500 годам вычислений на одном ЦП и 110 годам вычислений на одном ГП». [2]
24 апреля 2019 года в докладе Гаэтана Лёрента и Томаса Пейрена, представленном на Eurocrypt 2019, было описано усовершенствование ранее лучшей атаки с выбранным префиксом в функциях дайджеста типа Меркла-Дамгарда на основе блочных шифров Дэвиса-Майера . Благодаря этим улучшениям этот метод способен находить коллизии с выбранным префиксом примерно за 2 68 оценок SHA-1. Это примерно в 1 миллиард раз быстрее (и теперь может использоваться для многих целевых атак благодаря возможности выбора префикса, например, вредоносного кода или поддельных удостоверений в подписанных сертификатах), чем 2 77,1 оценок предыдущей атаки (но без выбранного префикса, что было непрактично для большинства целевых атак, поскольку найденные коллизии были почти случайными) [1] и достаточно быстро, чтобы быть практичным для находчивых злоумышленников, требуя примерно 100 000 долларов США на облачную обработку. Этот метод также способен находить коллизии выбранного префикса в функции MD5 , но при сложности 2 46,3 не превосходит предыдущий наилучший доступный метод на теоретическом уровне (2 39 ), хотя потенциально на практическом уровне (≤2 49 ). [55] Эта атака требует памяти 500+ ГБ.
5 января 2020 года авторы опубликовали улучшенную атаку под названием «shambles». [8] В этой статье они демонстрируют атаку на коллизию с выбранным префиксом со сложностью 2 63,4 , которая на момент публикации стоила бы 45 тыс. долларов США за одну сгенерированную коллизию.
Реализации всех функций безопасности, одобренных FIPS, могут быть официально проверены с помощью программы CMVP , совместно проводимой Национальным институтом стандартов и технологий (NIST) и Communications Security Establishment (CSE). Для неформальной проверки пакет для генерации большого количества тестовых векторов доступен для загрузки на сайте NIST; полученная проверка, однако, не заменяет формальную проверку CMVP, которая требуется по закону для определенных приложений.
По состоянию на декабрь 2013 года [обновлять]существует более 2000 проверенных реализаций SHA-1, 14 из которых способны обрабатывать сообщения с длиной в битах, не кратной восьми (см. список проверок SHS, заархивированный 23 августа 2011 г. на Wayback Machine ).
Это примеры дайджестов сообщений SHA-1 в шестнадцатеричном формате и в двоичном формате Base64 для кодирования текста ASCII .
SHA1("The quick brown fox jumps over the lazy dog")
Даже небольшое изменение в сообщении с подавляющей вероятностью приведет к изменению многих битов из-за лавинного эффекта . Например, изменение dog
на cog
создает хэш с другими значениями для 81 из 160 битов:
SHA1("The quick brown fox jumps over the lazy cog")
Хэш строки нулевой длины:
SHA1("")
Ниже приведен псевдокод алгоритма SHA-1:
Примечание 1: Все переменные являются беззнаковыми 32-битными величинами и переносятся по модулю 2 32 при вычислении, за исключением ml, длины сообщения, которая является 64-битной величиной, и hh, дайджеста сообщения, который является 160-битной величиной. Примечание 2: Все константы в этом псевдокоде находятся в big endian . В каждом слове самый старший байт хранится в крайней левой позиции байтаИнициализация переменных:h0 = 0x67452301h1 = 0xEFCDAB89h2 = 0x98BADCFEh3 = 0x10325476h4 = 0xC3D2E1F0ml = длина сообщения в битах (всегда кратна количеству бит в символе).Предварительная обработка:добавьте бит «1» к сообщению, например, добавив 0x80, если длина сообщения кратна 8 битам.добавить 0 ≤ k < 512 бит «0», так чтобы результирующая длина сообщения в битах была сравнима с −64 ≡ 448 (mod 512)добавить ml, исходную длину сообщения в битах, как 64-битное целое число с обратным порядком байтов . Таким образом, общая длина кратна 512 битам.Обрабатываем сообщение последовательными 512-битными фрагментами:разбить сообщение на 512-битные фрагментыдля каждого куска разбить кусок на шестнадцать 32-битных слов с обратным порядком байтов w[i], 0 ≤ i ≤ 15 Расписание сообщений: расширить шестнадцать 32-битных слов до восьмидесяти 32-битных слов: для i от 16 до 79 Примечание 3: SHA-0 отличается тем, что не имеет этого левого вращения. w[i] = (w[i-3] xor w[i-8] xor w[i-14] xor w[i-16]) левое вращение 1 Инициализируем хеш-значение для этого фрагмента: а = h0 б = х1 с = h2 д = х3 е = h4 Основной цикл: [3] [56] для i от 0 до 79, если 0 ≤ i ≤ 19 , то f = (b и c) или (( не b) и d) к = 0x5A827999 иначе если 20 ≤ i ≤ 39 f = b xor c xor d к = 0x6ED9EBA1 иначе если 40 ≤ i ≤ 59 f = (b и c) или (b и d) или (c и d) к = 0x8F1BBCDC иначе если 60 ≤ i ≤ 79 f = b xor c xor d к = 0xCA62C1D6 temp = (a левый поворот 5) + f + e + k + w[i] е = д д = с c = b левое вращение 30 б = а а = температура Добавьте хэш этого фрагмента к текущему результату: h0 = h0 + а h1 = h1 + b h2 = h2 + с h3 = h3 + d h4 = h4 + еСоздать окончательное значение хэша (big-endian) в виде 160-битного числа: hh = (h0 leftshift 128) или (h1 leftshift 96) или (h2 leftshift 64) или (h3 leftshift 32) или h4
Число hh
представляет собой дайджест сообщения, который можно записать в шестнадцатеричном формате (основание 16).
Выбранные постоянные значения, используемые в алгоритме, предполагались как нечто само собой разумеющееся :
k
— это 2 30 квадратных корней из 2, 3, 5 и 10. Однако они были неправильно округлены до ближайшего целого числа вместо того, чтобы округлиться до ближайшего нечетного целого числа с уравновешенными пропорциями нулевых и единичных битов. Кроме того, выбор квадратного корня из 10 (который не является простым числом) сделал его общим множителем для двух других выбранных квадратных корней из простых чисел 2 и 5 с возможно полезными арифметическими свойствами в последовательных раундах, что снизило устойчивость алгоритма к поиску коллизий в некоторых битах.h0
through h3
совпадают с алгоритмом MD5, а пятое (для h4
) аналогично. Однако они не были должным образом проверены на устойчивость к инверсии нескольких первых раундов для вывода возможных коллизий в некоторых битах, которые можно использовать в многоблочных дифференциальных атаках.Вместо показанной формулировки из исходного документа FIPS PUB 180-1 для вычислений f
в основном цикле выше можно использовать следующие эквивалентные выражения:
Побитовый выбор между c и d , контролируемый b . (0 ≤ i ≤ 19): f = d xor (b и (c xor d)) (альтернатива 1) (0 ≤ i ≤ 19): f = (b и c) или (( не b) и d) (альтернатива 2) (0 ≤ i ≤ 19): f = (b и c) xor (( не b) и d) (альтернатива 3) (0 ≤ i ≤ 19): f = vec_sel(d, c, b) (альтернатива 4) [премо08]Функция побитового большинства. (40 ≤ i ≤ 59): f = (b и c) или (d и (b или c)) (вариант 1) (40 ≤ i ≤ 59): f = (b и c) или (d и (b xor c)) (вариант 2) (40 ≤ i ≤ 59): f = (b и c) xor (d и (b xor c)) (вариант 3) (40 ≤ i ≤ 59): f = (b и c) xor (b и d) xor (c и d) (вариант 4) (40 ≤ i ≤ 59): f = vec_sel(c, b, c xor d) (вариант 5)
Также было показано [57] , что для раундов 32–79 вычисление:
w[i] = (w[i-3] xor w[i-8] xor w[i-14] xor w[i-16]) левое вращение 1
можно заменить на:
w[i] = (w[i-6] xor w[i-16] xor w[i-28] xor w[i-32]) левое вращение 2
Это преобразование сохраняет все операнды выровненными по 64 бита и, устраняя зависимость от w[i]
, w[i-3]
обеспечивает эффективную реализацию SIMD с длиной вектора 4, как инструкции SSE x86 .
В таблице ниже внутреннее состояние означает «внутреннюю хеш-сумму» после каждого сжатия блока данных.
Ниже приведен список криптографических библиотек, поддерживающих SHA-1:
Аппаратное ускорение обеспечивается следующими расширениями процессора:
Вслед за SHAttered Марк Стивенс и Дэн Шумоу опубликовали "sha1collisiondetection" (SHA-1CD), вариант SHA-1, который обнаруживает атаки столкновений и изменяет вывод хэша при их обнаружении. Частота ложных срабатываний составляет 2 −90 . [64] SHA-1CD используется GitHub с марта 2017 года и git с версии 2.13.0 от мая 2017 года. [65]
отличие от SHA-1 и SHA-2, Keccak не имеет слабости расширения длины, поэтому ему не нужна вложенная конструкция HMAC. Вместо этого вычисление MAC можно выполнить, просто добавив ключ к сообщению.