Base64変換
文字列とBase64を相互に変換します。日本語などのUTF-8文字と、JWTなどで使うURLセーフ形式に対応。
+ と / を使い、末尾を = で埋める。メールやデータURLで使う一般的な形式
使い方とメモ
- 日本語や絵文字は UTF-8 のバイト列にしてから Base64 にします。他のツールや言語で UTF-8 として扱った結果と一致します。
- デコードは
形式の選択にかかわらず、標準と URLセーフのどちらを貼っても戻せます。改行や空白が混ざっていても無視します。 - デコード結果が文字として読めないときは、画像やファイルを Base64 にしたものの可能性があります。その場合はバイト数だけお知らせします。
- 変換はブラウザの中だけで動きます。トークンや認証情報を貼っても、どこにも送信されません。
Base64 のしくみ
Base64 は、どんなバイト列も英数字と記号 64 種類だけで書き表すための変換です。メールの本文や URL、JSON のように「決まった文字しか通せない場所」に、画像やバイナリを載せるために使われます。
元のデータを 3 バイト(24 ビット)ずつ区切り、6 ビットずつ 4 文字に置き換えます。そのため、変換後の長さは元のおよそ 4/3(約 33% 増し)になります。最後が 3 バイトに満たないときは、足りない分を = で埋めて 4 文字にそろえます。
a → YQ== (1 バイト) ab → YWI= (2 バイト) abc → YWJj (3 バイト) abcd → YWJjZA== (4 バイト)
標準と URL セーフの違い
標準の Base64 は + と / を使います。どちらも URL の中では特別な意味を持つため、URL やファイル名に入れる用途では、+ を - に、/ を _ に置き換えた「URL セーフ」形式(base64url)を使います。末尾の = も省くのが一般的です。
標準 Pz8+Pg== URLセーフ Pz8-Pg
JWT(JSON Web Token)は、ピリオドで区切られた 3 つの部分がそれぞれ URL セーフ形式です。真ん中の部分をこのツールでデコードすると、中身の JSON(ユーザー ID や有効期限)を読めます。ただし、署名が正しいかどうかまでは確かめられません。
日本語が文字化けする理由
Base64 が扱うのは文字ではなくバイト列です。同じ「あ」でも、どの文字コードでバイト列にしたかによって結果が変わります。
あ(UTF-8) → 44GC あ(Shift_JIS) → gqA=
別のツールでデコードした結果が文字化けするときは、元のデータが UTF-8 以外(古いシステムの Shift_JIS など)で作られている可能性があります。このツールは UTF-8 として読むので、上の gqA= をデコードすると「UTF-8 の文字列として読めません」と表示されます。
JavaScript の btoa() に日本語をそのまま渡すと InvalidCharacterError になるのも同じ理由です。btoa() は 1 文字を 1 バイトとして扱うので、先に TextEncoder で UTF-8 のバイト列にしてから変換する必要があります。
よく見かける場所
- Basic 認証:
Authorization: Basic dXNlcjpwYXNzの後半はuser:passを Base64 にしたものです。デコードすればそのまま読めます。 - data URI:
data:image/png;base64,iVBORw0…のように、画像を HTML や CSS に直接埋め込む書き方です。 - メールの添付ファイル: 添付ファイルは Base64 にして本文に入れて送られます。その際、76 文字ごとに改行が入ります。
- 証明書や鍵(PEM 形式):
-----BEGIN CERTIFICATE-----で囲まれた部分は、64 文字ごとに改行された Base64 です。
Base64 は暗号化ではない
Base64 は誰でも元に戻せる「書き方の変換」で、中身を隠す働きはありません。Basic 認証のパスワードや JWT の中身が読めてしまうのはそのためです。秘密にしたい情報は、Base64 にするだけでなく HTTPS で送る、暗号化するなど、別の手段で守ってください。