Base64とは
Base64はバイナリデータを純テキストにエンコードする方式です。64個の印刷可能文字(A-Z、a-z、0-9、+、/)で任意のバイナリデータを表現し、バイナリデータをテキストのみ対応のチャネル(JSON、XML、URL、メールなど)で転送できるようにします。
エンコードの原理
文字テーブル
Base64は64個の文字を使用します:大文字A-Z(26)、小文字a-z(26)、数字0-9(10)、プラス記号+、スラッシュ/、合計64個。等号=は末尾のパディングとして使われます。
エンコード処理
- 入力データを3バイト(24ビット)ごとにグループ化
- 24ビットを4つのグループ(各6ビット)に分割
- 各6ビットグループが1つのBase64文字に対応(2の6乗=64、ちょうど64文字)
- 3バイトに満たない場合は=でパディング
例
3バイトの入力(24ビット)→ 4つのBase64文字。つまりエンコード後のバイト数は元の4/3、約133%、33%増加します。
なぜ33%大きくなるのか
本質的に、1バイトは256種類の値(8ビット)を表現できますが、Base64の各文字は64種類の値(6ビット)しか表現しません。同じ情報量を表現するには、6ビットエンコードは8ビットエンコードより8/6=4/3倍の文字数を必要とします。したがってBase64エンコード後のサイズは元の4/3、33%増加します。
これはBase64の固有のコストです——空間を「テキスト転送可能」であることと引き換えにしています。
エンコード例
テキスト「Man」(3バイトASCII):
- M = 77 = 01001101
- a = 97 = 01100001
- n = 110 = 01101110
- 24ビットに結合:01001101 01100001 01101110
- 4つの6ビットグループに分割:010011 010110 000101 101110
- 対応するBase64文字:T W F u
- エンコード結果:TWFu
3バイトが4バイトになり、ちょうど4/3です。
Base64のバリアント
標準Base64
文字テーブルに+と/を含み、末尾に=でパディング。汎用ユースケースに適しています。
URLセーフBase64
+と/はURL内で特別な意味を持つため、-と_に置き換えます。URL転送に適しています。
Base64URL
URLセーフバリアント、JWT(JSON Web Token)でよく使用されます。
Base64 vs Base32 vs Hex
Base64
- 文字セット64個
- エンコード後に33%増大
- 文字は大文字小文字英数字と+/を含む、大文字小文字を区別
Base32
- 文字セット32個(A-Z、2-7)
- エンコード後に60%増大
- 大文字小文字を区別しない、紛らわしい文字を回避、手動入力に適する
Hex(16進数)
- 文字セット16個(0-9、a-f)
- エンコード後に100%増大(各バイトが2文字になる)
- 最もシンプルで互換性が高いが、サイズが倍増
サイズ:Hex > Base32 > Base64。小さくしたいならBase64、互換性とシンプルさならHexを選びましょう。
Base64は暗号化か
いいえ。Base64はエンコードであり、暗号化ではありません。誰でもデコードでき、鍵による保護がありません。Base64を暗号化として扱うのは重大な誤解です——ただ「乱雑な文字列」に偽装しているだけで、デコードすれば平文になります。
機密データにはAESなどの暗号化アルゴリズムを使いましょう。Base64は転送エンコード専用です。
ユースケース
データ転送
バイナリデータをテキストチャネル(JSON、XML、URL、メール)で転送する際、Base64でテキストにエンコードします。
小画像の埋め込み
小画像をBase64エンコードしてHTML/CSSにインライン埋め込み、HTTPリクエストを削減します(詳しくはBase64画像の用途を参照)。
JWT
JSON Web TokenはBase64URLでヘッダーとペイロードをエンコードします。
Data URI
data URLプロトコルはBase64でリソースを埋め込みます。
Basic認証
HTTP Basic認証はBase64でユーザー名とパスワードをエンコードします(暗号化ではないため、HTTPSと併用必須)。
DocsAllでエンコード・デコード
- テキストまたはBase64文字列を入力
- エンコードまたはデコードを選択
- ワンクリックで変換
- 結果をコピー
ブラウザ側で処理、データは外部に送信されません。
よくある落とし穴
暗号化扱い
Base64は暗号化ではありません。機密データをBase64だけで「保護」しないでください。
エンコード後のサイズ増大
大きなファイルをBase64エンコードすると33%膨張し、転送・ストレージコストが増加します。バイナリチャネルが使えるならBase64を使わないでください。
文字セットの混同
標準Base64は+/を含むため、URLに含める場合はエスケープするかURLセーフバリアントを使います。バリアントの混用はデコード失敗を招きます。
末尾の=は省略不可
パディング文字=はエンコードの一部であり、省略するとデコードエラーが発生する可能性があります。一部の実装は省略を許容しますが、非標準です。
まとめ
Base64はエンコードであり暗号化ではありません。64文字でバイナリを表現し、33%のサイズ増加は固有のコストです。目的はバイナリをテキストチャネルで転送できるようにすることです。URLのユースケースではURLセーフバリアントを使いましょう。DocsAllエンコード・デコードツールはブラウザで動作、データは外部に送信されません。