Вчера на code review я увидел коммит с проверкой целостности конфига через MD5. “Ну вот, ещё один мидл, не знающий про уязвимости MD5”, — подумал я. Но когда полез в историю, оказалось, что хеш нужен для совместимости со старой системой мониторинга. Это хороший повод разобрать, когда какие хеши реально используют в 2024.
Браузер как хеш-машина
Современные браузеры умеют считать хеши на клиенте через Web Crypto API. Вот минимальный пример для SHA-256:
async function hashText(text) {
const encoder = new TextEncoder();
const data = encoder.encode(text);
const hashBuffer = await crypto.subtle.digest('SHA-256', data);
return Array.from(new Uint8Array(hashBuffer))
.map(b => b.toString(16).padStart(2, '0'))
.join('');
}
Но в работе мне чаще нужны сразу несколько вариантов — например, когда:
- Легаси-система требует MD5
- Git-хостинг показывает SHA-1 коммита
- Нужно сверить подпись документа с SHA-256
Для таких случаев держу в закладках Text Hash Generator. Это чистый клиентский инструмент, который за один клик выдаёт все четыре популярных хеша.
Почему MD5 ещё жив
В security-чатах принято демонизировать MD5, но в реальности он встречается чаще, чем кажется:
- В старых CI/CD-пайплайнах как чексумма артефактов
- В системах кеширования (например, для генерации ключей кеша)
- В unit-тестах, где важна только детерминированность
Главное — не использовать MD5 там, где есть хотя бы намёк на security-контекст. Коллизии находятся за секунды, и это не теоретическая угроза — вспомните историю с поддельными SSL-сертификатами.
SHA-256 как новый стандарт
Когда нужно что-то посерьёзнее, default choice — SHA-256:
- Подпись git-тегов
- Валидация TLS-сертификатов
- Хеширование паролей (в сочетании с salt)
Интересный момент: на 64-битных CPU SHA-512 может работать быстрее SHA-256 из-за оптимизаций под 64-битные операции. Но на практике разницу заметите только при обработке гигабайтов данных.
Когда клиентские хеши полезны
- Быстрые проверки — сверить, что env-файл не менялся после последнего деплоя
- Документирование — вставить хеши конфигов в ADR
- Отладка — сравнить, что хеш строки в браузере совпадает с бекенд-расчётом
Но есть и подводные камни:
- Web Crypto API недоступен в insecure-контекстах (http без localhost)
- Для больших файлов лучше использовать stream-обработку
- Хеширование паролей на клиенте — плохая идея (нужен хотя бы salt)
Если инструмент вроде Text Hash Generator кажется вам слишком простым, попробуйте собрать его аналог на Rust+WASM — хорошее упражнение для понимания работы хеш-функций. А если нужно что-то production-ready, смотрите в сторону crypto-js для более сложных сценариев.
P.S. Тот самый мидл из начала истории в итоге добавил в README пояснение про legacy-совместимость. Мораль: иногда старые хеши — это не технический долг, а осознанный выбор.
Попробуй сам: DigitalOcean — $200 кредитов для новых пользователей.