Общая идея и поколение алгоритмов
MD5 и SHA-256 — хеш-функции: превращают данные произвольной длины в отпечаток фиксированного размера. MD5 разработан в начале девяностых и выдаёт значение в 128 бит. SHA-256 относится к семейству SHA-2 и выдаёт 256 бит. Оба используются много лет, но их надёжность сегодня различается принципиально.
MD5 считается устаревшим для задач, где нужна стойкость к намеренным подделкам. SHA-256 остаётся актуальным стандартом в широком круге приложений.
Коллизии и что они значат
Коллизия — ситуация, когда два разных набора данных дают один хеш. Для MD5 методы построения коллизий известны давно и выполняются практически. Это значит, что злоумышленник может подготовить два разных файла с одинаковым MD5, и проверка по этому хешу не докажет, что вам подсунули именно тот файл.
Для SHA-256 практических способов найти коллизию неизвестно. Поэтому его используют в цифровых подписях, сертификатах, проверках целостности с расчётом на противодействие подделке.
Скорость и практика
MD5 работает быстрее и даёт более короткую строку, поэтому он продолжает встречаться: в контрольных суммах для обнаружения случайных повреждений, в старых системах и в случаях, где важна только скорость и нет злонамеренного противника. Для такой цели он всё ещё работает, но лучше выбирать современные варианты, если нет причин иного.
SHA-256 медленнее, но на современных процессорах разница не мешает: файлы хеш-суммируются быстро. Для новых систем нет причин выбирать MD5.
Чего не делают ни тот ни другой
Ни MD5, ни SHA-256 не подходят для хранения паролей в чистом виде. Это быстрые универсальные функции, а для паролей нужны намеренно медленные, с солью. Использование MD5 или простого SHA-256 для этой цели считается ошибкой: их можно перебирать с огромной скоростью.
Ещё одно ограничение: хеш сам по себе не подтверждает происхождение. Отпечаток, опубликованный на том же ресурсе, что и файл, защищает лишь от случайных повреждений, но не от подмены, если ресурс скомпрометирован.
Как посчитать и сверить хеш файла
Проверка отпечатка файла занимает минуту. В Windows это делает команда certutil с параметром -hashfile, в Linux и macOS утилиты md5sum, sha256sum или shasum. Вы указываете файл и получаете строку из шестнадцатеричных символов. Затем сравниваете её с опубликованной на странице разработчика: совпасть должны все символы.
Сравнивайте внимательно, лучше средствами системы, а не глазами. Один изменённый символ означает, что файл другой. Если отпечатки не совпали, скачайте файл заново, а при повторном несовпадении проверьте источник: возможны повреждение при передаче или подмена.
Помните ограничение: отпечаток полезен, когда он получен из независимого надёжного канала. Если его рядом с файлом разместил злоумышленник, он подтвердит подменённый файл. Поэтому серьёзные проекты подписывают релизы цифровой подписью, которую можно проверить открытым ключом разработчика.
При выборе функции для собственных скриптов берите SHA-256 по умолчанию. Разница по времени для обычных файлов будет незаметной, зато вы не окажетесь в ситуации, когда придётся объяснять, почему в защитной проверке используется устаревший алгоритм.
Что выбрать: MD5 или SHA-256
Для проверки безопасности и подписи используйте SHA-256 или другие функции семейства SHA-2 и SHA-3. Для простой проверки повреждений при копировании допустим и MD5, но разумнее сразу использовать SHA-256, чтобы не думать о ситуации подделки.
Если вам встретилась система, где MD5 применяется для защиты, стоит запланировать замену. Для паролей выбирайте специальные функции, а не универсальные хеши.
Отдельно стоит упомянуть, что существуют и более новые функции, например из семейства SHA-3 и BLAKE2, но в повседневных задачах SHA-256 поддерживается везде и полностью достаточен.
Итог: MD5 годится разве что для обнаружения случайных ошибок, SHA-256 подходит для проверки целостности с расчётом на противодействие подделке, а для паролей нужны специальные медленные функции. Используйте современные алгоритмы по умолчанию и переходите на них при первой возможности в старых системах.
Если старая система выдаёт только MD5, сверяйте хотя бы его, но параллельно ищите более надёжный способ подтверждения источника, например подпись разработчика или зеркало с независимой публикацией отпечатков.