使い方
- Base64 文字列を入力欄に貼り付けます。「変換元」には Base64、「変換先」には「16進数」があらかじめ選択されています。
- 16進数の出力を確認します。1 バイトごとに 16進数 2 桁で表されます。
- Base58 や Base32 など別の形式が必要な場合は「変換先」のエンコード方式を変更します。16進数から Base64 に戻すには「入力と出力を入れ替え」ボタンを押します。
- 結果をコピーします。
同じバイト列の 2 通りの表し方
16進数と Base64 は、どちらもバイナリデータをテキストとして表す方法です。16進数は 1 バイトに 2 文字を使うため、個々のバイト値を読み取ったり比較したりしやすくなります。Base64 は 3 バイトを 4 文字にまとめるため、長さが約 3 分の 1 短くなります。両者の変換で変わるのは表記だけで、データそのものは変わりません。
| 値 | バイト数 | 16進数の長さ | Base64 の長さ |
|---|---|---|---|
| MD5 ハッシュ | 16 | 32 | 24 |
| SHA-1 ハッシュ | 20 | 40 | 28 |
| SHA-256 ハッシュ、Ed25519 公開鍵 | 32 | 64 | 44 |
| SHA-384 ハッシュ | 48 | 96 | 64 |
| SHA-512 ハッシュ、Ed25519 署名 | 64 | 128 | 88 |
バイナリエディタ、パケットアナライザ、デバッガが表示するのも 16進数です。Base64 を 16進数に変換すれば、これらのツールの表示とデータを突き合わせられます。
Base64 を 16進数に変換する必要がある場面
- ハッシュ値の比較。
sha256sumなどのツールは 16進数で出力しますが、サブリソース完全性(SRI)属性、コンテンツセキュリティポリシー(CSP)のハッシュ、Content-MD5などのチェックサムヘッダーでは Base64 が使われます。比較するには、どちらか一方を変換します。 - SSH フィンガープリント。
ssh-keygen -lはSHA256:形式のフィンガープリントをパディングなしの Base64 で表示しますが、SSHFP DNS レコードには同じ SHA-256 ダイジェストが 16進数で格納されます。SHA256:より後ろの部分を貼り付けると、16進数の形式が得られます。 - 鍵、IV、署名。暗号処理のコードをデバッグするとき、バイト列を 16進数で見ると、長さの確認や値の比較、バイトの欠落や余分なバイトの発見が簡単になります。
入力できる形式
Base64 入力に含まれるスペースや改行は無視され、URL セーフ文字の - と _ も受け付けます。= によるパディングは省略可能なので、JSON、JWT、ターミナルの出力からコピーした値をそのまま貼り付けられます。変換はデコード後のバイト列に対して行われます。結果はデータそのものの 16進数であり、Base64 の文字自体の 16進数ではありません。テキストの文字コードを 16進数で確認したい場合は、代わりに Base16 を使用してください。
# シェル
printf '%s' "$B64" | base64 --decode | xxd -p
# Python
base64.b64decode(s).hex()
// Node.js
Buffer.from(s, 'base64').toString('hex')
よくある質問
Base64 の文字列そのものを変換するのですか、それとも表しているバイト列を変換するのですか?
16進数の出力が Base64 の入力より長くなるのはなぜですか?
16進数は 1 バイトあたり 2 文字が必要ですが、Base64 は約 1.33 文字で済みます。32 バイトの SHA-256 ダイジェストは、Base64 では 44 文字、16進数では 64 文字になります。
大文字の 16進数やコロン区切りにするにはどうすればよいですか?
JWT や JSON Web Key の Base64URL 値も変換できますか?
はい。URL セーフ文字やパディングの欠落は自動的に処理されるため、鍵のパラメーターや署名をそのまま貼り付けられます。