ハッシュ出力のBase64エンコーディング

ハッシュダイジェストを16進数の代わりにBase64エンコードする場面と方法を解説。Base64と16進数のトレードオフ、URL安全Base64、JWT・SRI・CSPでの用途を学びます。

General

詳細な説明

ハッシュダイジェストの最も一般的なエンコーディングは16進数ですが、Base64エンコーディングはよりコンパクトな表現を提供します。一部のプロトコルや標準はBase64エンコードされたハッシュを明確に要求しており、このフォーマットの使い方を理解することが重要です。

Base64エンコーディングの基本:

Base64は64個のASCII文字(A-Z、a-z、0-9、+、/)と「=」(パディング用)でバイナリデータを表します。3バイトの入力が4文字のBase64になり、約33%のサイズ増加です(16進数の100%増加と比較)。SHA-256ハッシュ(32バイト)はBase64で44文字、16進数で64文字です。SHA-512ハッシュ(64バイト)はBase64で88文字、16進数で128文字です。

URL安全Base64:

標準Base64の「+」と「/」はURLで特別な意味を持ちます。URL安全Base64(Base64urlとも呼ばれ、RFC 4648で定義)は「+」を「-」に、「/」を「_」に置き換えます。JWTはヘッダーとペイロードをBase64urlでエンコードするためこの形式を使用します。

Base64ハッシュを要求する標準:

Subresource Integrity(SRI)はHTMLでBase64エンコードされたSHA-256/SHA-384/SHA-512ハッシュを使用:<script integrity="sha256-[base64hash]">。Content Security Policy(CSP)もスクリプトとスタイルのハッシュに同じ形式を使用します。JWT(JSON Web Token)はHMAC-SHA256署名をBase64urlでエンコードします。Amazon S3のContent-MD5ヘッダーはBase64エンコードされたMD5を要求します。

形式間の変換:

JavaScriptでは:btoa(String.fromCharCode(...new Uint8Array(hashBuffer)))で生のハッシュバイトをBase64に変換。Pythonでは:base64.b64encode(hashlib.sha256(data).digest()).decode()でBase64を生成(.hexdigest()ではなく.digest()で生バイトを返すことに注意)。

16進数とBase64の選択:

16進数を使う場面:ユーザーへのハッシュ表示、チェックサムファイル(SHA256SUMS)への保存、ログでのハッシュ比較。Base64を使う場面:プロトコルが要求する場合(SRI、JWT、CSP)、スペース効率が重要な場合(データベース、URL)、Base64を使用するシステムとの相互運用。システム内の一貫性が絶対的な選択より重要です。

ユースケース

Base64ハッシュエンコーディングは、HTMLのSubresource Integrity(SRI)タグ、JWT署名、Content Security Policyハッシュ、Amazon S3のコンテンツ検証に必要です。

Try It — Hash Generator

フルツールを開く