Инструменты разработчика · SHA хеш-калькулятор
Как SubtleCrypto.digest вычисляет хеш SHA-256 в браузере
· Как это работает
ша-256 криптография API-интерфейс браузера
Каждый современный браузер может хэшировать байты с помощью Web Crypto. Этот пост следует за одной строкой от TextEncoder через crypto.subtle.digest до шестнадцатеричного дайджеста и объясняет ограничения каждого шага.
Хэш без установки npm — ситуации, когда нативный дайджест превосходит встроенную библиотеку
Вы можете рассчитать дайджест для короткого текстового значения без установки пакета хеширования или публикации данных на удаленном хэш-сайте. Браузеры предоставляют crypto.subtle.digest в безопасных источниках. Хэш — это детерминированный отпечаток байтов фиксированной длины; он не скрывает вводимые данные и не доказывает, кто их предоставил. ToolAcre использует реализацию браузера, а не рукописный алгоритм SHA, и сохраняет хешируемую строку на вкладке.
Текст — это не байты: кодирование входных данных с помощью TextEncoder в UTF-8 перед хешированием и почему этот шаг определяет ответ
Текст «кафе» и байты, введенные в хэш, не являются объектами одного и того же типа. TextEncoder сопоставляет строку с UTF-8 байтами (63 61 66 C3 A9 для кафе), в то время как простое преобразование Latin-1 использовало бы E9 для последнего символа и создавало бы другой дайджест. Даже визуально идентичный текст может иметь разные формы нормализации Unicode. Согласуйте кодировку и нормализацию, прежде чем сравнивать хэши между JavaScript, CLI и сервером. Текстовый режим ToolAcre явно выполняет преобразование UTF-8 перед хешированием.
Вызов дайджеста — crypto.subtle.digest с именем алгоритма и ArrayBuffer и почему он возвращает обещание
crypto.subtle.digest("SHA-256", bytes) возвращает обещание, поскольку криптографическая работа может быть асинхронной; дождитесь этого, прежде чем читать вывод. Этот метод принимает весь входной буфер, а не потоковый итератор. SHA-256 выдает 256 bits (32 bytes) независимо от того, содержит ли ввод три символа или три миллиона. Ограничение безопасного контекста означает, что для SubtleCrypto API требуется HTTPS или localhost, и инструмент сообщает об его отсутствии вместо того, чтобы изобретать запасной вариант.
От ArrayBuffer к шестнадцатеричному — преобразование байтов результата в строку символов 64, которую узнают люди.
Promise преобразуется в ArrayBuffer из байтов, а не в знакомую строку шестнадцатеричных цифр. При необходимости преобразуйте каждый байт в два символа базы 16 с ведущим нулем, получая ровно 64 символов нижнего регистра для SHA-256. Это шестнадцатеричное представление удваивает длину 32 bytes, но не меняет дайджест. Base64 мог бы представлять тот же 32 bytes более компактно; сравнение имеет смысл только после подтверждения соответствия алгоритма, входной кодировки и выходного представления.
Рабочий пример — пошаговое хеширование короткой строки с указанием байтов на каждом этапе.
Для текста ASCII abc UTF-8 создает байты 61 62 63. SHA-256 из этих байтов составляет ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad. Проверьте это в ToolAcre и другой реализации доверенного хэша: замена abc на abc с последующим переводом строки дает другой результат. Если выходные данные различаются, проверьте скрытые пробелы и кодировку байтов, прежде чем подозревать криптографический примитив. Отображаемый дайджест представляет собой воспроизводимый тестовый вектор, а не заявление о том, что abc является секретом.
Безопасные контексты — почему crypto.subtle доступен только на HTTPS и локальном хосте
crypto.subtle — это безопасный контекст API. Рабочая страница HTTPS и страница разработки localhost обычно предоставляют его; обычная небезопасная удаленная страница HTTP не может этого сделать. Инструменту также требуется достаточно памяти для хранения входных и выходных данных. Если Web Crypto недоступен, автоматическое переключение на непроверенный хеш JavaScript может привести к тому, что чувствительный к безопасности результат будет зависеть от другой реализации. Очевидно, что вы потерпите неудачу и вместо этого выберите безопасную среду.
Что это не охватывает — хеширование с использованием ключей (HMAC) и инкрементное хеширование очень больших входных данных, которые не обеспечивает одноразовый дайджест API.
Одноразовый дайджест API не является инкрементальным хешированием огромных файлов. SHA-256 не является схемой хранения паролей: быстрые несоленые хэши удешевляют угадывание, поэтому для хранения паролей требуется специально созданный, соленый и намеренно дорогостоящий KDF. SHA-1 может отображаться для совместимости с устаревшими версиями, но его устойчивость к коллизиям нарушена, и он не является хорошим выбором для новых систем целостности или подписи. HMAC — это аутентификация по ключу, а не обработка неаутентифицированных байтов.
Вывод: в браузере уже есть хэш-функция — хеш-калькулятор ToolAcre SHA использует именно эту API, поэтому его выходные данные являются собственными для браузера.
Браузер уже предоставляет SHA-256: кодирует текст в байтах, ожидает дайджеста, затем форматирует результат для сравнения. ToolAcre SHA хеш-калькулятор следует по этому пути для вставленного текста и меток SHA-1 только для устаревших версий. Сначала сравните abc с известным результатом, а затем хешируйте фактический неконфиденциальный материал, байты и кодировку которого вы понимаете.