Генерация хешей в браузере: когда MD5 и SHA ещё нужны

#crypto#webdev#tooling

Вчера на 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('');
}

Но в работе мне чаще нужны сразу несколько вариантов — например, когда:

Для таких случаев держу в закладках Text Hash Generator. Это чистый клиентский инструмент, который за один клик выдаёт все четыре популярных хеша.

Почему MD5 ещё жив

В security-чатах принято демонизировать MD5, но в реальности он встречается чаще, чем кажется:

Главное — не использовать MD5 там, где есть хотя бы намёк на security-контекст. Коллизии находятся за секунды, и это не теоретическая угроза — вспомните историю с поддельными SSL-сертификатами.

SHA-256 как новый стандарт

Когда нужно что-то посерьёзнее, default choice — SHA-256:

Интересный момент: на 64-битных CPU SHA-512 может работать быстрее SHA-256 из-за оптимизаций под 64-битные операции. Но на практике разницу заметите только при обработке гигабайтов данных.

Когда клиентские хеши полезны

  1. Быстрые проверки — сверить, что env-файл не менялся после последнего деплоя
  2. Документирование — вставить хеши конфигов в ADR
  3. Отладка — сравнить, что хеш строки в браузере совпадает с бекенд-расчётом

Но есть и подводные камни:

Если инструмент вроде Text Hash Generator кажется вам слишком простым, попробуйте собрать его аналог на Rust+WASM — хорошее упражнение для понимания работы хеш-функций. А если нужно что-то production-ready, смотрите в сторону crypto-js для более сложных сценариев.

P.S. Тот самый мидл из начала истории в итоге добавил в README пояснение про legacy-совместимость. Мораль: иногда старые хеши — это не технический долг, а осознанный выбор.


Попробуй сам: DigitalOcean — $200 кредитов для новых пользователей.


Источник: https://dev.to/azam-akram/generate-md5-sha-1-sha-256-and-sha-512-hashes-instantly-in-your-browser-2o10