Что такое контрольная сумма? Объяснение MD5, SHA-1, SHA-256
Контрольная сумма — это короткий 'отпечаток', который позволяет проверить, не был ли файл изменен или поврежден. Понимание того, какой алгоритм хеширования использовать и в чем недостатки MD5, убережет вас от распространенных ошибок безопасности.
Что такое контрольная сумма?
Контрольная сумма — это строка фиксированной длины, полученная из фрагмента данных путем обработки их с помощью хеш-функции. Контрольная сумма действует как отпечаток пальца: если изменится хотя бы один бит исходных данных, контрольная сумма полностью изменится. Это делает контрольные суммы полезными для двух вещей:
- Проверка целостности — не был ли этот файл поврежден или изменен при передаче?
- Идентификация — является ли этот конкретный файл (или фрагмент данных) таким же, как другая копия?
Когда вы скачиваете программное обеспечение с официального сайта, на странице загрузки часто отображается хеш MD5 или SHA-256. После загрузки вы вычисляете хеш вашего локального файла и сравниваете его. Если они совпадают, файл цел.
Как работает хеш-функция
Криптографическая хеш-функция принимает входные данные любой длины и выдает дайджест фиксированной длины. Четыре свойства определяют хорошую хеш-функцию:
- Детерминированность — один и тот же вход всегда дает одинаковый выход
- Однонаправленность — вы не можете обратить хеш обратно к исходным данным (в разумные сроки)
- Эффект лавины — изменение одного символа во входных данных меняет примерно половину бит выходных данных
- Стойкость к коллизиям — должно быть вычислительно невозможно найти два разных входных значения, которые производят одинаковый хеш
SHA-256("hello") = 2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824SHA-256("Hello") = 185f8db32921bd46d35e3a1a4e9a9b9c6a7e6a7d2d2c4e9d... (совершенно другой)
MD5 — Быстрый, знакомый и небезопасный для защиты данных
MD5 (Message Digest Algorithm 5) создает 128-битный дайджест (32 символа в шестнадцатеричной системе). Он был разработан в 1991 году и стал стандартным алгоритмом контрольных сумм в интернете примерно на два десятилетия.
Где MD5 все еще приемлем:
- Проверки целостности без учета безопасности — подтверждение того, что большой файл не был поврежден во время передачи
- Дедупликация — проверка того, идентичны ли два файла (как быстрая предварительная проверка перед побайтовым сравнением)
- Ключи кеша и ETags, где атаки с коллизиями не представляют проблемы
Где MD5 неприемлем:
- Хранение паролей — MD5 чрезвычайно быстр, что делает атаки методом перебора с помощью GPU тривиальными. Достижимо создание миллиардов хешей MD5 в секунду на потребительском оборудовании.
- Цифровые подписи — атаки с коллизиями MD5 были продемонстрированы на практике. Можно создать два разных файла с одинаковым хешем MD5.
- Отпечатки сертификатов — здесь также применяется та же проблема с коллизиями.
md5($password) в устаревшем коде, замените его на password_hash() в PHP или bcrypt/Argon2 в любом другом языке. MD5 не является алгоритмом хеширования паролей — он никогда не проектировался как медленный, а именно медлительность делает хеширование паролей безопасным.
SHA-1 — Устаревший стандарт
SHA-1 создает 160-битный дайджест (40 символов в шестнадцатеричной системе). Он заменил MD5 в качестве рекомендуемого алгоритма в конце 1990-х годов и широко использовался в сертификатах SSL/TLS, системах контроля версий и проверках целостности файлов.
В 2017 году команда Project Zero от Google продемонстрировала первую практическую коллизию SHA-1 (атака "SHAttered"), потребовавшую вычислительных мощностей примерно в 6 500 процессорных лет. Ведущие браузеры и центры сертификации прекратили принимать сертификаты SHA-1 в 2017 году. Git все еще использует SHA-1 внутри для хешей коммитов, но они находятся в процессе перехода на SHA-256 как альтернативу.
Для новых приложений не используйте SHA-1. Используйте вместо него SHA-256 или SHA-512.
SHA-256 — Текущий стандарт
SHA-256 является частью семейства SHA-2, разработанного NSA и опубликованного в 2001 году. Он создает 256-битный дайджест (64 символа в шестнадцатеричной системе). На сегодняшний день практических атак с коллизиями против SHA-256 не существует.
Используйте SHA-256 для:
- Проверки целостности файлов (скачивание программ, резервное копирование)
- Цифровых подписей (сертификаты TLS, подпись кода)
- Токенов аутентификации на основе HMAC (HMAC-SHA256)
- Блокчейна и криптовалют (биткоин использует двойной SHA-256)
- Хешей коммитов в Git в режиме SHA-256
- Подписей JWT (JSON Web Token) при использовании HS256 или RS256
SHA-256 — правильный выбор по умолчанию для почти любого приложения, которому нужен безопасный хеш. Если сомневаетесь, используйте SHA-256.
SHA-512 — Когда нужно больше
SHA-512 создает 512-битный дайджест (128 символов в шестнадцатеричной системе). Он принадлежит к тому же семейству SHA-2 и обладает такой же степенью безопасности. Основное практическое различие:
- На 64-битных процессорах SHA-512 может быть фактически быстрее, чем SHA-256, потому что алгоритм оптимизирован для размеров слов в 64 бит
- На 32-битных системах и оборудовании быстрее работает SHA-256
- SHA-512 имеет больший выходной результат, что означает увеличение объема хранения и передачи
Используйте SHA-512, когда приложение требует более длинного дайджеста или когда вы работаете на оборудовании, где SHA-512 имеет преимущество в производительности. Для большинства веб-приложений достаточно SHA-256.
Примечание по хешированию паролей
Ни один из вышеуказанных алгоритмов не должен использоваться напрямую для хранения паролей. MD5, SHA-1, SHA-256 и SHA-512 все спроектированы как быстрые — а для паролей быстрота является ошибкой.
Хеширование паролей должно быть намеренно медленным, чтобы украденную базу данных нельзя было быстро взломать. Используйте специально разработанные алгоритмы хеширования паролей:
- bcrypt — является стандартом уже более 20 лет, поддерживается практически во всех языках
- Argon2 (в частности Argon2id) — победитель конкурса Password Hashing Competition (2015), рекомендуется для новых приложений
- scrypt — с защитой от атак на память, также отличный выбор
В PHP: password_hash($password, PASSWORD_ARGON2ID). В Node.js: используйте пакеты bcryptjs или argon2. Они автоматически обрабатывают генерацию соли и настройку параметров сложности.
Как проверить контрольную сумму файла
Когда вы скачиваете программное обеспечение, а сайт предоставляет хеш SHA-256:
shasum -a 256 downloaded-file.zip
# сравните результат с официальным хешем
В Windows (PowerShell):
Get-FileHash downloaded-file.zip -Algorithm SHA256
В качестве альтернативы используйте наш генератор хешей, чтобы вставить содержимое файла или текст и мгновенно вычислить хеши MD5, SHA-1, SHA-256 или SHA-512 прямо в браузере — ничего не отправляется на сервер.
Сгенерировать MD5, SHA-256 и другие
Вычислите любой хеш (MD5, SHA-1, SHA-256, SHA-512) из текста или содержимого файла прямо в вашем браузере — без загрузки файлов и использования сервера.