SHA-1
SHA-1 (Secure Hash Algorithm 1) — это криптографическая хеш-функция, разработанная Агентством национальной безопасности США (NSA) и опубликованная Национальным институтом стандартов и технологий США (NIST) в 1995 году. Она относится к семейству алгоритмов Secure Hash Algorithm (SHA) и предназначена для преобразования входных данных произвольной длины в фиксированную выходную последовательность (хеш-значение) длиной 160 бит (20 байт). SHA-1 широко применялась в протоколах безопасности, цифровых подписях и проверке целостности данных, однако к началу 2020-х годов была признана устаревшей и небезопасной для использования в криптографических целях из-за уязвимости к коллизиям.
История
Разработка и стандартизация
SHA-1 был разработан как преемник SHA-0, который был опубликован в 1993 году, но вскоре отозван из-за необъявленной уязвимости. В 1995 году NIST опубликовал SHA-1 в качестве федерального стандарта обработки информации (FIPS PUB 180-1). Алгоритм стал частью стандарта Digital Signature Standard (DSS) и использовался в протоколах SSL/TLS, SSH, PGP, а также в системах контроля версий (например, Git) для идентификации объектов.
Обнаружение уязвимостей
Первые теоретические атаки на SHA-1 были предложены в 2005 году группой криптографов (Ван Сяоюнь, Инь Ицинь и Лиза Юй). Они продемонстрировали возможность нахождения коллизий (двух разных сообщений с одинаковым хешем) с вычислительной сложностью около 2^69 операций, что значительно ниже теоретической границы 2^80 для идеальной 160-битной хеш-функции. В последующие годы сложность атак снижалась: к 2015 году была показана возможность атаки с трудоёмкостью 2^57,5.
Практическая демонстрация коллизий
В феврале 2017 года исследователи из Google и Центра математики и информатики (CWI) в Нидерландах опубликовали первую практическую коллизию для SHA-1. Они использовали метод, названный SHAttered, который потребовал 9×10^18 операций хеширования (эквивалент 110 лет работы одного графического процессора). Демонстрация показала два разных PDF-документа с одинаковым хешем SHA-1. В 2020 году была представлена атака SHAppening, снизившая стоимость нахождения коллизии до 2^63,4 операций.
Отказ от использования
После публикации SHAttered NIST рекомендовал прекратить использование SHA-1 для цифровых подписей и сертификатов к 2030 году. Крупные браузеры (Chrome, Firefox, Safari) начали постепенно отказываться от доверия к сертификатам, подписанным с использованием SHA-1. В 2021 году Microsoft выпустила обновление, блокирующее загрузку файлов с хешами SHA-1 в некоторых сценариях. К 2023 году SHA-1 был полностью исключён из стандартов TLS 1.3 и большинства криптографических библиотек.
Принцип работы
Общая схема
SHA-1 обрабатывает входное сообщение блоками по 512 бит (64 байта). Алгоритм состоит из следующих этапов:
- Дополнение сообщения — к исходным данным добавляется бит «1», затем нулевые биты и 64-битное представление длины исходного сообщения, чтобы общая длина стала кратной 512 битам.
- Инициализация — устанавливаются пять 32-битных переменных состояния (A, B, C, D, E) с фиксированными начальными значениями.
- Обработка блоков — каждый 512-битный блок расширяется до 80 слов (по 32 бита) и обрабатывается в 80 раундов, использующих нелинейные функции (f1–f4) и константы.
- Финальное объединение — после обработки всех блоков значения переменных состояния объединяются в 160-битный хеш.
Раунды
Каждый из 80 раундов включает:
- Вычисление нелинейной функции от трёх переменных состояния.
- Циклический сдвиг.
- Сложение с константой и словом из расширенного сообщения.
- Перестановку переменных состояния.
Используемые нелинейные функции:
- Раунды 0–19: f1(B, C, D) = (B ∧ C) ∨ (¬B ∧ D)
- Раунды 20–39: f2(B, C, D) = B ⊕ C ⊕ D
- Раунды 40–59: f3(B, C, D) = (B ∧ C) ∨ (B ∧ D) ∨ (C ∧ D)
- Раунды 60–79: f4(B, C, D) = B ⊕ C ⊕ D
Криптостойкость и атаки
Теоретические уязвимости
Основная уязвимость SHA-1 связана с его 160-битной длиной хеша, что делает его теоретически уязвимым к атаке «дня рождения» с трудоёмкостью 2^80 операций. Однако из-за структурных недостатков (отсутствие строгой лавинной функции, линейность в некоторых раундах) практическая стойкость оказалась ниже.
Известные атаки
- Коллизионные атаки: нахождение двух разных сообщений с одинаковым хешем. Первая практическая коллизия (SHAttered) потребовала 9×10^18 операций и 100 лет процессорного времени.
- Атаки на прообраз: нахождение сообщения по заданному хешу. Для SHA-1 такие атаки остаются непрактичными (трудоёмкость ~2^160), но теоретически возможны.
- Атаки на второй прообраз: нахождение второго сообщения с тем же хешем, что и заданное. Трудоёмкость оценивается в 2^106 операций.
Сравнение с другими алгоритмами
| Алгоритм | Длина хеша | Стойкость к коллизиям | Статус |
|---|---|---|---|
| SHA-1 | 160 бит | 2^63 (практически) | Устарел, не рекомендуется |
| SHA-256 | 256 бит | 2^128 | Рекомендуется |
| SHA-3 | 224–512 бит | 2^112 – 2^256 | Рекомендуется |
Применение
Историческое использование
- Цифровые подписи: SHA-1 использовался в алгоритмах RSA и DSA для создания подписей.
- Сертификаты X.509: многие центры сертификации выпускали сертификаты с подписью SHA-1 до 2017 года.
- Протоколы безопасности: SSL/TLS, IPsec, SSH применяли SHA-1 для аутентификации и целостности.
- Системы контроля версий: Git использует SHA-1 для идентификации коммитов и объектов (хотя в 2023 году начат переход на SHA-256).
- Проверка целостности файлов: утилиты (sha1sum, shasum) применялись для вычисления контрольных сумм.
Современное состояние
На 2025 год SHA-1 всё ещё используется в некоторых устаревших системах и для не криптографических целей (например, дедупликация данных, хеширование паролей в низконагруженных системах). Однако для любых задач, связанных с безопасностью, настоятельно рекомендуется использовать SHA-256, SHA-3 или BLAKE2.
Переход на более безопасные алгоритмы
Рекомендации NIST
NIST рекомендует:
- Прекратить использование SHA-1 для цифровых подписей к 2030 году.
- Для новых систем использовать SHA-256 или SHA-3.
- В протоколах TLS 1.3 SHA-1 полностью исключён.
Миграция в Git
В 2023 году проект Git объявил о переходе на SHA-256 в качестве основного алгоритма хеширования. Однако из-за обратной совместимости SHA-1 продолжает использоваться в существующих репозиториях.
Критика и ограничения
- Энергопотребление: SHA-1 требует больше вычислительных ресурсов по сравнению с современными алгоритмами (например, BLAKE2).
- Отсутствие защиты от атак по сторонним каналам: реализация SHA-1 может быть уязвима к атакам по времени или энергопотреблению.
- Непригодность для паролей: SHA-1 не является криптографической функцией с медленным хешированием, поэтому не рекомендуется для хранения паролей (вместо него используются bcrypt, scrypt, Argon2).
Интересные факты
- SHA-1 был разработан NSA, но опубликован как открытый стандарт без патентных ограничений.
- В 2017 году Google и CWI потратили 6500 лет процессорного времени на вычисление коллизии SHAttered.
- Алгоритм SHA-1 до сих пор используется в некоторых банкоматах и старых платежных терминалах, что создаёт риски безопасности.
Источники
- National Institute of Standards and Technology. FIPS PUB 180-1: Secure Hash Standard. 1995.
- Wang, X., Yin, Y., Yu, H. Finding Collisions in the Full SHA-1. CRYPTO 2005.
- Stevens, M., Bursztein, E., Karpman, P., et al. The First Collision for Full SHA-1. CRYPTO 2017.
- NIST. Transitioning the Use of Cryptographic Algorithms and Key Lengths. SP 800-131A Rev. 2. 2019.
- Git SCM. Git Hash Function Transition. 2023.
BFOmetr — база данных и аналитика по компаниям России.
На главную BFOmetr →