MD5 против SHA-256: различия, безопасность и когда использовать каждый
Сравните MD5, SHA-1, SHA-256 и SHA-3: как работают хэш-функции, почему MD5 не работает, скорость, контрольные суммы, HMAC и правильный способ хэширования паролей.
· 6 мин чтения
Хэш-функции являются одними из наиболее широко используемых строительных блоков в программном обеспечении. Они проверяют загрузки, удаляют дубликаты файлов, подписывают запросы API, питают Git и блокчейны и защищают хранящиеся пароли. MD5 и SHA-256 - это два названия, с которыми разработчики сталкиваются чаще всего, и вопрос "Могу ли я все еще использовать MD5?" возникает постоянно. Короткий ответ: для всего, что связано с безопасностью, нет; для обнаружения случайной коррупции, он все еще работает. Более длинный ответ объясняет, почему, и что использовать вместо этого.
Что делает криптографическая хэш-функция
Хэш-функция принимает вход любой длины и производит выход фиксированной длины, называемый перевариванием. MD5 производит 128 бит (32 шестизначных символа); SHA-256 производит 256 бит (64 шестизначных символа).
MD5("hello world") = 5eb63bbbe01eeed093cb22bb8f5acdc3
SHA-256("hello world") = b94d27b9934d3e08a52e52d7da7dabfac484efe37a5380ee9088f7ace2efcde9
Хороший криптографический хэш имеет три свойства безопасности:
- ** Сопротивление предварительного изображения:** При наличии пересмотра невозможно найти какой-либо вход, который его производит.
- ** Сопротивление второму предварительному изображению:** При наличии входа невозможно найти другой вход с одним и тем же обработкой.
- ** Сопротивляемость столкновениям:** невозможно найти два различных входа с одним и тем же перевариванием.
Он также должен показывать эффект лавины: изменение одного бита ввода изменяет около половины выводов, поэтому аналогичные входы имеют совершенно несвязанные с ними перевари. Попробуйте это в [генераторе хэша] ((/инструменты/хэша): "привет миру" и "привет миру!" производят переваривания, не имеющие ничего общего.
Краткая история MD5
Рон Ривест разработал MD5 в 1991 году. Он был быстрым и стал повсеместным: контрольные суммы файлов, хранилища паролей, цифровые сертификаты. В течение нескольких лет появились слабости, и в 2004 году исследователи продемонстрировали практические столкновения. К 2008 году команда создала сертификат авторитетного сертификата, используя столкновения MD5, а в 2012 году вредоносное ПО Flame использовало столкновение MD5 для подделки сертификатов Microsoft. Сегодня создание столкновения MD5 занимает секунды на ноутбуке.
Атаки на MD5 остаются теоретическими, но сопротивление столкновения полностью нарушено, и этого достаточно, чтобы исключить его для подписей, сертификатов и проверок целостности, где может быть задействован злоумышленник.
SHA-1: также отменен
SHA-1, с 160-битным выходом, следовал аналогичному пути. Теоретические недостатки были опубликованы в 2005 году, а в 2017 году Google и CWI Amsterdam произвели первое реальное столкновение ("SHAttered"): два разных файла PDF с одним и тем же хэшем SHA-1. Браузеры перестали принимать сертификаты SHA-1, и Git переходит на SHA-256. Относитесь к SHA-1 как к MD5.
SHA-256 и семейство SHA-2
SHA-2, опубликованный NIST в 2001 году, включает в себя SHA-224, SHA-256, SHA-384 и SHA-512. SHA-256 является наиболее широко используемым: сертификаты TLS, подпись кода, Биткойн, менеджеры пакетов, целостность субресурсов, JWT-подписи (HS256 и RS256) и многое другое. После более чем двух десятилетий анализа не существует практических атак на его сопротивление столкновению или предварительного изображения.
SHA-512 использует 64-разрядные операции и часто быстрее, чем SHA-256 на 64-разрядных процессорах без аппаратного ускорения. SHA-384 является сокращенной версией SHA-512, которая также устойчива к атакам с расширением длины.
SHA-3
SHA-3 (Keccak), стандартизированный в 2015 году, использует совершенно другую внутреннюю конструкцию конструкцию губки , поэтому прорыв против SHA-2 не повлияет на него автоматически. Это не замена SHA-2, а резервная копия с другими свойствами. Используйте его там, где требуется спецификация; в противном случае SHA-256 остается прагматическим по умолчанию.
Сопоставление со стороны
| Алгоритм | Размер выпуска | Сопротивление столкновениям | Статус |
|---|---|---|---|
| MD5 | 128 бит | Разбито (секунды) | Не для безопасности. |
| SHA-1 | 160 бит | Стройный (2017) | Не для безопасности. |
| SHA-256 | 256 бит | Безопасно | Рекомендуемый по умолчанию |
| SHA-512 | 512 бит | Безопасно | Рекомендуется |
| SHA3-256 / SHA3-512 | 256 / 512 бит | Безопасно | Рекомендуемая альтернатива |
| Блэк3 | 256 бит (расширяется) | Безопасно | Очень быстрое, растущее принятие |
Скорость
MD5 быстрее SHA-256 в чистом программном обеспечении, но разрыв имеет меньшее значение, чем люди думают. Современные процессоры x86 и ARM включают в себя аппаратные инструкции SHA-256, которые заставляют SHA-256 работать со скоростью гигабайт в секунду. На практике чтение файла с диска или сети обычно является узким горлом, а не хэшированием. Если для использования, не связанного с безопасностью, важна скорость, BLAKE3 или некриптографические хэши, такие как xxHash, побеждают оба.
Когда MD5 все еще приемлем
Слабость столкновения MD5 имеет значение только когда кто-то может намеренно создать входные данные. Он остается приемлемым для:
- Обнаружение случайных повреждений в процессе передачи или хранения, когда не участвует злоумышленник.
- ** Ключи к кэшу и дедупликация** доверенных данных, например, выделение собственных файлов.
- ** Совместимость с устаревшими **, например, системы, которые публикуют только контрольные суммы MD5 или протоколы, которые требуют этого.
Даже в этих случаях выбор SHA-256 не стоит дорого и исключает необходимость утверждать, что никакой злоумышленник никогда не мог быть вовлечен. Многие инциденты начинались с контрольной суммы, которая была "только для коррупции", на которую позже полагались для обеспечения безопасности.
Проверка правильности загрузки
Когда проект публикует контрольную сумму SHA-256, вычислите хеш загрузки и сравните каждый символ:
sha256sum ubuntu.iso # Linux
shasum -a 256 ubuntu.iso # macOS
Get-FileHash ubuntu.iso # Windows PowerShell
Совпадающая контрольная сумма доказывает, что файл совпадает с тем, что издатель хэшировал. Это не доказывает, что издатель является законным: если злоумышленник контролирует веб-сайт, он может заменить как файл, так и контрольную сумму. Подписанные контрольные суммы (GPG или Sigstore) закрывают этот пробел.
HMAC: хеш с помощью ключа
Простой хэш доказывает целостность, но не подлинность любой может вычислить его. HMAC объединяет секретный ключ с сообщением, поэтому только стороны, обладающие ключом, могут производить или проверять результат. Webhooks от Stripe, GitHub и Slack используют подписи HMAC-SHA256, а [JWTs подписанные HS256] ((/blog/how-jwt-works) под капотом HMAC-SHA256.
Не создавайте свой собственный хэш с ключом, соединяя secret + message и хэшируя его. С MD5, SHA-1 и SHA-256, это уязвимо для длинных расширений атак. Используйте стандартную конструкцию HMAC, которую предоставляет каждый язык. При сравнении подписей используйте функцию сравнения постоянного времени, чтобы избежать атак времени.
Паролям нужен совершенно другой инструмент.
Ни MD5, ни SHA-256 не должны использоваться непосредственно для хранения паролей. Быстрые хэши являются недостатком: современный графический процессор вычисляет миллиарды хэшей SHA-256 в секунду, поэтому злоумышленник, который украл вашу базу данных, может быстро протестировать огромные списки вероятных паролей. Несоленые хэши хуже, потому что предварительно вычисленные таблицы моментально взламывают обычные пароли.
Используйте пароль с хэширующей функцией, предназначенной для медленного и жесткого запоминания:
- Argon2id победитель конкурса по hashing паролей и первый выбор.
- скрипт запоминающийся и широко доступный.
- bcrypt старше, но все еще приемлемо, с лимитом ввода 72 байта.
- PBKDF2 с высоким количеством итераций когда соответствие требует примитив, одобренных NIST.
Эти функции добавляют уникальную соль на пароль и конфигурируемый фактор затрат, который вы можете увеличить по мере ускорения оборудования. Библиотеки занимаются деталями: вы звоните hash(password) и verify(password, stored).
Кодирование сборников
Дигесты представляют собой сырые байты, обычно отображаемые как гексадецимальные (два символа на байт) или Base64 (более компактные). Тот же SHA-256 содержит 64 шестерковых символа или 44 базовых символа. Атрибуты подресурса Integrity используют Base64 (sha384-...), в то время как файлы контрольных сумм используют hex. Подробнее о кодировании см. [Base64 объяснил] ((/blog/base64-explained).
Руководство по принятию решений
- Проверка целостности, подписи, сертификаты, все, что связано с безопасностью: SHA-256 (или SHA-512, SHA-3, BLAKE3).
- ** Аутентификация сообщений с общим секретом:** HMAC-SHA256.
- ** Хранение паролей:** Argon2id, scrypt или bcrypt никогда не простой хэш.
- Несоперничающие контрольные суммы или ключи кэша: MD5 работает, но SHA-256 является более безопасной привычкой.
- Очень быстрый несекретный хэшинг (хеш-таблицы, шардинг): xxHash или аналогичные некриптографические хэши.
Итоги
MD5 и SHA-1 разбиты для сопротивления столкновениям и не должны использоваться там, где злоумышленник может извлечь выгоду из ввода. SHA-256 безопасен, быстрый с поддержкой аппаратного обеспечения и правильным по умолчанию для целостности и подписей. Используйте HMAC для аутентификации с ключом и специальные медленные функции, такие как Argon2id для паролей. Если вы сомневаетесь, выберите SHA-256 это никогда не является неправильным ответом для целостности, а MD5 все чаще является.
Эта страница переведена с английского автоматически. Если вы заметили ошибку, сообщите нам.