使い方
- 16進数の文字列を入力欄に貼り付けます。「変換元」には「16進数」、「変換先」には Base64 があらかじめ選択されています。
- 書式を気にする必要はありません。スペース、改行、コロン、ハイフン、0x や \x のプレフィックスは無視されます。
- 値を URL、JWT、JSON Web Key で使う場合は、「変換先」を Base64URL に切り替えます。
- Base64 の結果をコピーします。
16進数を Base64 に変換する理由
ほとんどのハッシュツールはダイジェストを 16進数で出力しますが、多くのプロトコルでは、それより 3 分の 1 短い Base64 が求められます。代表的な例は次のとおりです。
- サブリソース完全性(SRI)。スクリプトやスタイルシートの
integrity属性には、sha384-に続けて 64 文字の Base64 を書く形式で、Base64 のダイジェストを指定します。 - コンテンツセキュリティポリシー(CSP)。インラインスクリプトを許可するハッシュは、Base64 の値を使って
'sha256-...'の形式で記述します。 - HTTP API のチェックサム。
Content-MD5ヘッダーや Amazon S3 のチェックサムヘッダーには、md5sumが出力する 16進文字列ではなく、バイナリのダイジェストを Base64 にしたものを指定します。 - 短い識別子。UUID は 16 バイトで、16進数では 32 桁になりますが、パディングなしの Base64URL ならわずか 22 文字です。
対応している 16進数の形式
16進数の数字は大文字と小文字を区別しません。デコードの前に、空白、改行、コロン、セミコロン、カンマ、ハイフン、およびプレフィックス 0x、\x、%、&#x を取り除きます。そのため、AB:CD:EF のような OpenSSL のフィンガープリント、0x12, 0x34 のような C 言語の配列、\x12\x34 のようなエスケープ文字列、パーセントエンコードされたバイト、ハイフン付きの UUID をそのまま扱えます。
整形後の入力は、1 バイトにつき 2 桁で、桁数が偶数でなければなりません。桁数が奇数の場合はエラーになります。これは通常、先頭のゼロが抜け落ちたことを意味します。たとえば、0abc のつもりで abc と書いた場合です。
16進数のテキストではなく、バイト列をエンコードする
よくある間違いは、16進数のダイジェストを通常のテキスト用 Base64 エンコーダーに貼り付けてしまうことです。そうすると、16進数が表すバイト列ではなく 0-9a-f の文字そのものがエンコードされ、結果は本来の 2 倍の長さになります。SHA-256 ダイジェストなら、44 文字のはずが 88 文字になります。SRI 属性やチェックサムヘッダーなど、バイナリのダイジェストを想定している場所では受け付けられません。このツールは、まず 16進数をバイト列にデコードします。
# シェル:16進数のダイジェストを Base64 に変換
printf '%s' "$HEX" | xxd -r -p | base64
# ファイルの SRI 値を 1 回で生成
openssl dgst -sha384 -binary script.js | openssl base64 -A
# Python
base64.b64encode(bytes.fromhex(h)).decode()
// Node.js(16進数以外の文字が現れると、エラーを出さずにそこで処理を終了)
Buffer.from(h, 'hex').toString('base64')
よくある質問
16進文字列を入力するとエラーになるのはなぜですか?
入力に 16進数ではない文字(数字のゼロの代わりにアルファベットの O など)が含まれているか、桁数が奇数であるかのどちらかです。エラーメッセージには無効な文字の位置が表示されます。桁数が奇数の場合は、先頭の 0 が抜けていないか確認してください。
Base64 の出力はどのくらいの長さになりますか?
= 記号 1 つを含む 44 文字の Base64 になります。サブリソース完全性(SRI)のハッシュはどうやって作成しますか?
integrity="sha384-..." と記述します。OpenSSL を使えば、openssl dgst -sha384 -binary file.js | openssl base64 -A の 1 つのコマンドで作成できます。出力は標準の Base64 ですか、それとも URL セーフな Base64 ですか?
+ と / を使う標準の Base64 です。URL セーフな出力が必要な場合は、「変換先」のエンコード方式に Base64URL を選択してください。