開発者ツール · SHA ハッシュ計算ツール
Hex、Base64、および Raw バイト: 同じ SHA ダイジェストを書き込む 3 つの方法
· 仕組み
しゃ-256 base64 エンコード ファイル形式
sha256sum は 16 進数を出力し、package-lock.json は Base64 を格納し、Docker は sha256: プレフィックスを使用します。これらはすべて同じ 32 バイトにすることができます。この投稿では、それぞれの表現とそれらの間で変換する方法について説明します。
見た目は違うが一致するハッシュ - 同じファイルのロックファイル文字列と端末チェックサム
SHA-256 ダイジェストは基本的に 32 バイトです。これらのバイトをどのように記述するかによって、ダイジェストがどのように見えるかが決まります。 1 つのダイジェスト、32 同一バイトは、64 16 進文字 (1 バイトあたり 2 文字) または 44 Base64 文字 (3 バイトあたり約 4 文字)、またはエンコーディングに応じて異なる長さと形式として表示されます。混乱が生じるのは、どちらも基になる同じ 32 バイトに対して、ロックファイルでは 1 つの表現が表示され、端末では別の表現が表示される場合があるためです。
エンコーディングを理解することは、「なぜこれらが異なって見えるのか?」を考えるステップです。 「同じであることを確認できます。」 3 つの表現はすべて、デコードしてバイトに戻すと同等になります。
ダイジェストは、テキスト エンコード前のバイトです — アルゴリズムに応じて、そのうちの 20、32、48、または 64
テキスト表現が存在する前は、結果はダイジェスト バイトの ArrayBuffer になります。 ToolAcre はそのバッファーを Uint8Array でラップし、各バイトを 2 つの 16 進数として書き込むか、btoa を呼び出す前に各バイトをバイナリ文字に変換します。どちらのフォーマッタもハッシュを再実行せず、単一のダイジェスト ビットも変更しません。
バイト幅は、このツールで選択されたアルゴリズムに従います。SHA-1 は 20 バイト、SHA-256 は 32 バイト、SHA-384 は 48 バイト、SHA-512 は 64 バイトを返します。これらは、アルゴリズムのメタデータとテストによって検証された、サポートされている出力です。生のバイトはプログラムによる比較に適しています。 hex と Base64 は、テキストを必要とするチャネルのトランスポート表記法です。
16 進数 — 1 バイトあたり 2 文字、それがコマンドライン ツールを支配する理由、およびケースの質問
16 進表現では、数字 0-9 と文字 A ~ F (または a ~ f) を使用して、4 ビット ニブルの 16 可能な値を表します。 2 つの 16 進数が 1 バイトを表します。入力 abc の SHA-256 ダイジェストは 32 バイトであるため、64 16 進文字として表示されます: ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad。これは、ほとんどのコマンドライン ツールが出力する形式です。 16 進数は人間が判読可能であり、明確です。すべてのバイトは毎回まったく同じ 2 文字で表されます。
16 進数は、ドキュメントおよびコマンド ラインにおけるチェックサムとハッシュのデフォルト形式です。読み取りとコピーが簡単で、パディングがなく、解釈時に大文字と小文字が区別されません (慣例により、一貫して小文字または大文字が指定されます)。また、URL または JSON でエスケープする必要がある特殊文字もありません。欠点は、生のバイトの 2 倍の文字数が必要なことです。そのため、他の形式が存在します。
Base64 および Base64url — 3 バイトあたり約 4 文字、パディング、およびそれぞれの出現場所 (SRI、npm、SSH フィンガープリント)
Base64 は、3 バイトを 64 文字のアルファベットから抽出された 4 つの文字としてエンコードします: A-Z、a-z、0-9、+、/. 3 バイト 61 62 63 (abc の ASCII コード) Base64 で YWJj としてエンコードします。完全な 32 バイトの SHA-256 ダイジェストは、約 44 の Base64 文字としてエンコードされます。 = 文字でパディングすると、出力の長さが 4 の倍数になるため、44 文字と 0 パディングが加算されます (32 は 3 の倍数であるため、パディングは必要ありません)。デコードではプロセスが逆に行われ、4 つの Base64 文字が 3 バイトにデコードされます。
Base64 は、package-lock.json ファイル、npm シュリンクラップ、HTML の SRI (サブリソース整合性) 属性、および SSH キーのフィンガープリントに表示されます。これはコンパクトであり、生のバイトよりも約 33% 長く、16 進数の 100% よりも長いです。トレードオフは、すべてのテキスト表現が同じように読みやすいわけではないということです。人間の目には、base64 は 16 進数よりもスクランブルのように見えます。
プレフィックス付き形式 — sha256: コンテナーダイジェスト内、sha384- 整合性属性内、SHA256: SSH 内
Base64url は、RFC 4648 で定義されているバリアントで、+ と /. を - と _ で置き換えます。アルファベットは A-Z、a-z、0-9、-、_ になります。 + と / は URL 内で特別な意味を持つため、JWT は Base64url を使用します (+ はクエリ文字列内のスペースとして読み取ることができ、/ はパス区切り文字です)。 JWT セグメントは常に Base64URL でエンコードされており、標準の Base64 を要求するデコーダーはそれを拒否します。逆に、標準のアルファベットを受け入れない Base64url デコーダは、標準の Base64 では失敗します。
Base64url ではパディングはオプションです。標準の Base64 は、出力の長さが 4 の倍数になるように = で埋め込みます。 = 自体が URL として扱いにくいため、Base64url ではパディングが省略されるのが一般的です。デコーダは、パディングの有無にかかわらず、base64url を受け入れる必要があり、エンコーダは、どちらを生成するかを明示する必要があります。 ToolAcre Base64 ツールは両方のアルファベットを受け入れ、入力時のパディングの欠落を許容し、出力時の形式を選択できます。
動作した例 — 1 つのダイジェストが 16 進数から Base64 に変換され、その逆に変換され、バイト境界がマークされています
接頭辞付き形式は、スキーム識別子をダイジェストに追加します。 Docker イメージ ダイジェストでは sha256:ba7816bf... が使用されます。ここで、sha256: はプレフィックスです。 SSH フィンガープリントでは、コロンを伴う SHA256: を使用します。一部のツールでは、sha256= または SHA256= (等号付き) を使用します。プレフィックスは純粋に情報提供のみを目的としています。どのアルゴリズムがダイジェストを生成したかがわかります。プレフィックスを削除すると、同じエンコード内の同じバイトが残ります。
ダイジェストを比較する場合、プレフィックスはノイズです。あるツールが SHA256:ba78... を出力し、別のツールが ba78... を出力する場合、それらは同じダイジェストです。接頭辞は形式に関する単なるメタデータです。同様に、sha256:- (一部のコンテナー コンテキストで使用) または sha384- (整合性属性で使用) のようなプレフィックスは、バイトを変更しないフォーマット規則です。比較のために剥がしてみます。
これでカバーされないもの - 特定のツールがどのエンコードを出力するか。比較する前に出力形式を確認してください
1 つのダイジェストである入力 abc の SHA-256 は、複数の形式で表示されます: hex (64 文字)、パディング付きの Base64 (44 文字)、パディング付きの Base64url (44 文字、+ と /), の代わりに - と _、またはさまざまなプレフィックス付き)。同様に、それぞれをバイトにデコードし、バイトを比較します。16 進表現 ba7816bf... はバイト 0xba 0x78 0x16 0xbf 0x8f 0x01 0xcf 0xea ... にデコードされます。デコードすると、base64 表現は同じバイト シーケンスに変換されます。
ToolAcre SHA ハッシュ計算機は、デフォルトで 16 進数で出力します。 Base64 が必要な場合は、別のツールを使用して 16 進数を Base64 に変換するか、同じサイトにある Base64 ユーティリティを使用してテキストを直接エンコードできます。特定のコンテキスト用に設計されたツール (package-lock.json の場合は npm、イメージ ダイジェストの場合は Docker) は、コンテキストが期待する形式で出力します。これらはすべて、異なる服を着た同じ 32 バイトであることを理解すると、ツール間で形式が一致しない場合の混乱が解消されます。
要点: 文字列ではなくバイトを比較します。ToolAcre SHA ハッシュ計算ツールでダイジェストを計算し、チェック対象の表現に変換します。
16 進数ダイジェストを Base64 に手動で変換するには、16 進数をバイトにグループ化し、各バイトを 10 進数に変換してから、base64 アルファベットを使用してエンコードします。バイト 0xba (16 進数 ba) は 10 進数の 186 です。 0x78 は 120 です。 0x16 は 22 です。 0xbf は 191 です。これら 4 バイトをグループ化し、base64 としてエンコードすると、文字 w (アルファベットの 0 + 22)、as (エンコード 186)、AA (エンコード 120)、vw (エンコード 191) が得られます。完全なダイジェストでは、これを 10 回実行し、必要に応じてパディングする必要があります。この手動プロセスは有益ですが、退屈です。 Base64 コンバータ ツールを使用すると、それが瞬時に行われます。
重要な洞察は、ダイジェストが最初にバイトであり、テキスト表現が二次であるということです。同じバイトのすべてのエンコードはデコードされて同じバイトに戻るため、整合性検証の目的で交換可能です。 16 進数の大文字と小文字の違い、base64 のパディングの違い、プレフィックス、およびスペースはすべて、実際の値に影響を与えない書式設定の選択です。表現間の変換機能を習得すると、ダイジェスト形式の不一致は、謎ではなく解決できるデバッグ問題になります。