16進数を Base64 に変換する方法
- 入力 · Hex(16進数) に16進数を貼り付けます。空白、改行、コロン、ハイフン、
0xや\xの接頭辞は読み飛ばされ、大文字小文字も区別しません。 - 入力に合わせて 出力 · Base64 に Base64 が表示されます。
- 受信側がパディングなしの Base64 を求めるなら、出力の下の パディング(=) のチェックを外します。折り返した出力が必要なら 折り返し を 64(PEM)か 76(MIME)にします。
- 出力をコピー するか、Base64 → Hex の切り替えで逆方向から結果を確かめます。Base64 を16進数に変換 は、同じツールを逆向きにしたものです。
ハッシュのダイジェスト:16進数と Base64
ハッシュ関数が返すのは生のバイト列です。sha256sum や md5sum などのコマンドラインツールはそれを16進数で表示しますが、多くのプロトコルは同じダイジェストを Base64 で求めます。以下は 5 バイトの hello のダイジェストです。
| ハッシュ | 16進数(sha256sum などの出力) | Base64 |
|---|---|---|
| MD5 | 5d41402abc4b2a76b9719d911017c592 | XUFAKrxLKna5cZ2REBfFkg== |
| SHA-1 | aaf4c61ddcc5e8a2dabede0f3b482cd9aea9434d | qvTGHdzF6KLavt4PO0gs2a6pQ00= |
| SHA-256 | 2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824 | LPJNul+wow4m6DsqxbninhsWHlwfp0JecwQzYpOLmCQ= |
Base64 の形式を求める場面:
- Subresource Integrity。
<script>や<link>タグのintegrity="sha384-…"には Base64 のダイジェストが入ります。SRI ハッシュ生成ツール は、ファイルから属性全体を作ります。 Content-MD5ヘッダー。 RFC 1864 は、この値を 16 バイトの MD5 ダイジェストの Base64 と定めています。これでアップロードを検証するオブジェクトストレージは、16進数の形式を拒否します。MD5 を Base64 で をご覧ください。- API リクエストの署名や HMAC:通常 Base64 で送られます。HMAC を Base64 で では、どちらの形式でも計算できます。
- 鍵とシークレット:
openssl rand -hex 32が出力する 32 バイトの鍵は、多くの設定ファイルが求める 44 文字の Base64 値になります。
自分のテキストやファイルの SHA-256 なら、SHA-256 を Base64 で を使えば16進数を経由する必要がありません。
よくある失敗:16進数のテキストをエンコードする
echo -n 2cf24d…9824 | base64 はそれらしい結果を返しますが、間違いです。表している 32 バイトの代わりに 16進数の 64 個の ASCII 文字をエンコードしてしまい、MmNmMjRk で始まる 88 文字を返します。この値をデコードすると16進数のテキストに戻るので、署名や整合性チェックが失敗するまで誰も気づきません。先に16進数をデコードしてください。
echo -n 2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824 | xxd -r -p | base64
# LPJNul+wow4m6DsqxbninhsWHlwfp0JecwQzYpOLmCQ=
printf hello | openssl dgst -sha256 -binary | base64
# same result, without going through hex at all
xxd -r -p はプレーンな16進数をバイト列に戻します。Vim に同梱されていて、最小構成のシステムでは xxd パッケージをインストールします。OpenSSL では、-binary を付けるとダイジェストが16進数ではなくバイト列で出力されます。
コードで16進数を Base64 に変換する
import base64
base64.b64encode(bytes.fromhex("5d41402abc4b2a76b9719d911017c592")).decode()
# 'XUFAKrxLKna5cZ2REBfFkg=='
Buffer.from("5d41402abc4b2a76b9719d911017c592", "hex").toString("base64");
// 'XUFAKrxLKna5cZ2REBfFkg=='
URLセーフやパディングなしのバリアントは Python と Node.js のページで解説しています。ダイジェストを URL や JWT に入れるなら、Base64 を Base64URL に変換 で結果を変換してください。
変換に失敗するとき
- 「16進数の桁数が奇数です」。 1 バイトには 2 桁必要で、コピーのときに 1 桁失われています。入力の両端を確認してください。
- 「予期しない文字」。
sha256:というラベルや、sha256sumがダイジェストの後に出力するファイル名など、16進数でないものが入力に含まれています。取り除いてください。表示 を押すとその位置に移動します。 - 16進ダンプのオフセット。
00000010: 4865 6c6cの00000010はデータではなく位置ですが、有効な16進数なので変換されてしまいます。オフセットのないxxd -pの出力を使ってください。
よくある質問
SHA-256 の16進ハッシュを Base64 に変換するには?
16進数 64 桁を入力欄に貼り付けます。結果は = で終わる 44 文字で、たとえば 2cf24dba…9824 は LPJNul+wow4m6DsqxbninhsWHlwfp0JecwQzYpOLmCQ= になります。コマンドラインなら echo -n HEX | xxd -r -p | base64 です。
Base64 が本来の 2 倍の長さになるのはなぜですか?
16進数の文字列がテキストとしてエンコードされ、16進数の 1 桁ごとに 1 バイトになったからです。SHA-256 ダイジェストをそのように扱うと、44 文字ではなく 88 文字になります。先に16進数をバイト列にデコードしてください。このツールはそうしています。
16進数の文字列は何文字の Base64 になりますか?
16進数 2 桁で 1 バイト、3 バイトごとに Base64 の 4 文字になり、4 の倍数に切り上げられます。32 桁(MD5)は 24 文字、40 桁(SHA-1)は 28 文字、64 桁(SHA-256)は 44 文字、128 桁(SHA-512)は 88 文字です。
UUID を Base64 に変換できますか?
できます。ハイフン付きのまま貼り付けてください。123e4567-e89b-12d3-a456-426614174000 の 16 バイトは Ej5FZ+ibEtOkVkJmFBdAAA== になり、36 文字が 24 文字になります。