日本語

開発者ツール · SHA ハッシュ計算ツール

SubtleCrypto.digest がブラウザーで SHA-256 ハッシュを計算する方法

· 仕組み

しゃ-256 暗号化 ブラウザAPI

UTF-8 bytes ブラウザの SHA-256 ダイジェストに入り、16 進数として残ります
オリジナル ToolAcre ベクトル イラスト

最新のブラウザはすべて、Web 暗号化を通じてネイティブにバイトをハッシュできます。この投稿では、TextEncoder から crypto.subtle.digest を介して 16 進ダイジェストまでの 1 つの文字列をたどり、各ステップの制約について説明します。

npm install を使用しないハッシュ — ネイティブ ダイジェストがバンドルされたライブラリを上回る状況

ハッシュ パッケージをインストールしたり、リモート ハッシュ Web サイトにデータを投稿したりしなくても、短いテキスト値のダイジェストを計算できます。ブラウザは安全なオリジンで crypto.subtle.digest を公開します。ハッシュは、バイトの決定論的な固定長のフィンガープリントです。入力を隠したり、誰が入力したかを証明したりすることはありません。 ToolAcre は、手書きの SHA アルゴリズムを出荷するのではなくブラウザ実装を使用し、タブ内でハッシュ化された文字列を保持します。

テキストはバイトではありません — ハッシュする前に TextEncoder を使用して入力を UTF-8 にエンコードすることと、このステップで答えが決まる理由

テキスト「カフェ」とハッシュに入力されるバイトは、同じ種類のオブジェクトではありません。 TextEncoder は文字列を UTF-8 bytes (カフェの場合は 63 61 66 C3 A9) にマップしますが、単純な Latin-1 変換では最後の文字に E9 が使用され、別のダイジェストが生成されます。見た目が同じテキストであっても、Unicode 正規化形式が異なる場合があります。 JavaScript、CLI、サーバー間でハッシュを比較する前に、エンコードと正規化について合意します。 ToolAcre のテキスト モードは、ハッシュする前に UTF-8 変換を明示的に実行します。

ダイジェスト呼び出し — アルゴリズム名と ArrayBuffer を含む crypto.subtle.digest と、それが Promise を返す理由

crypto.subtle.digest("SHA-256", bytes) は、暗号化作業が非同期である可能性があるため、Promise を返します。出力を読み取る前にそれを待ってください。このメソッドは、ストリーミング反復子ではなく入力バッファー全体を受け取ります。 SHA-256 は、入力文字数が 3 文字か 300 万文字かに関係なく、256 bits (32 bytes) を発行します。セキュア コンテキストの制限は、SubtleCrypto API には HTTPS または localhost が必要であることを意味し、ツールはフォールバックを作成する代わりに、HTTPS または localhost が存在しないことを報告します。

ArrayBuffer から 16 進数へ — 結果のバイトを人々が認識できる 64 文字の文字列に変換します

Promise は、よく知られた 16 進数の文字列ではなく、バイトの ArrayBuffer に解決されます。各バイトを、必要に応じて先頭にゼロを付けた 2 つの Base-16 文字に変換し、SHA-256 でちょうど 64 個の小文字を生成します。この 16 進表現は 32 bytes の長さを 2 倍にしますが、ダイジェストは変更しません。 Base64 は同じ 32 bytes をよりコンパクトに表現できます。比較は、アルゴリズム、入力エンコーディング、および出力表現が一致することを確認した後にのみ意味を持ちます。

実用的な例 — 短い文字列を段階的にハッシュ化し、各段階のバイトを表示します

ASCII テキスト abc の場合、UTF-8 はバイト 61 62 63 を生成します。これらの正確なバイトの SHA-256 は ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad です。これを ToolAcre と別の信頼できるハッシュ実装でテストします。abc を abc に続けて改行に変更すると、異なる結果が得られます。出力が異なる場合は、暗号化プリミティブを疑う前に、隠れた空白文字とバイト エンコーディングを調べてください。表示されるダイジェストは再現可能なテスト ベクトルであり、abc が秘密であるという主張ではありません。

安全なコンテキスト — crypto.subtle が HTTPS と localhost でのみ利用できる理由

crypto.subtle はセキュア コンテキスト API です。通常、運用中の HTTPS ページとローカルホストの開発ページで公開されます。通常の安全でないリモート HTTP ページはそうではない可能性があります。このツールには、入力と出力を保持するのに十分なメモリも必要です。 Web Crypto が利用できない場合、未レビューの JavaScript ハッシュにサイレントに切り替えると、セキュリティに依存した結果が別の実装に依存することになります。明らかに失敗し、代わりに安全な環境を選択してください。

これでカバーされないもの — ワンショット ダイジェスト API では提供されない、非常に大きな入力のキー付きハッシュ (HMAC) および増分ハッシュ

ワンショット ダイジェスト API は、巨大なファイルの増分ハッシュではありません。 SHA-256 はパスワード ストレージ スキームではありません。ソルトなしの高速ハッシュにより推測が安価になるため、パスワード ストレージには専用のソルト付き、意図的にコストのかかる KDF が必要です。 SHA-1 は従来の相互運用性のために表示される場合がありますが、衝突耐性が壊れているため、新しい整合性システムや署名システムには適していません。 HMAC はキー認証であり、未認証バイトのダイジェストと同じ操作ではありません。

要点: ブラウザにはすでにハッシュ関数があります。ToolAcre SHA ハッシュ計算ツールはまさにこの API を使用するため、その出力はブラウザ独自のものになります。

ブラウザーはすでに SHA-256 を提供しています。テキストをバイトとしてエンコードし、ダイジェストを待って、結果を比較用にフォーマットします。 ToolAcre SHA ハッシュ計算ツールは、貼り付けられたテキストのパスに従い、SHA-1 をレガシー専用としてラベル付けします。まず abc を既知の結果と比較し、次にバイトとエンコーディングが理解している実際の非機密データをハッシュします。