cv.cm

基礎知識 · テキスト・データ・セキュリティ

Base64 エンコードとは?

約6分で読めます

結論

Base64 は、印字可能な 64 種類の文字(A–Z、a–z、0–9、+、/)と、パディング用の = だけでバイナリデータを表す方法です。3 バイトごとに 6 ビットずつ4つのグループに分け、各グループを1文字に対応させるため、「Man」は「TWFu」になります。メール、JSON、URL のようにテキストしか通せない経路でもバイナリデータを安全に送れますが、サイズは約 33% 増えます。これはエンコードであって暗号化ではありません。

Base64を開く

Base64 の仕組みを順番に見る

Base64 は RFC 4648 で定義されています。64 = 2⁶ なので出力の1文字はちょうど 6 ビットを表し、3 バイト(24 ビット)がぴったり4文字に対応します。

手順Man
ASCII コード7797110
2進数(各 8 ビット)010011010110000101101110
  1. 24 ビットをつなげます:010011010110000101101110。
  2. 6 ビットずつ4つに分けます:010011 010110 000101 101110。
  3. 数値に変換します:19、22、5、46。
  4. それぞれを変換表で引きます(0 = A、25 = Z、26 = a、51 = z、52 = 0、61 = 9、62 = +、63 = /):T、W、F、u。
  5. 結果:TWFu。

= によるパディング

入力の長さが 3 の倍数でないときは、最後のグループをゼロのビットで埋め、足りないバイトを = で示します。そのため出力の長さは必ず 4 の倍数になります。

入力バイト数Base64
M1TQ==
Ma2TWE=
Man3TWFu
Hello5SGVsbG8=
é(UTF-8 のバイト列 C3 A9)2w6k=

n バイトをエンコードした長さは 4 × ceil(n ÷ 3) 文字です。1 MB のファイルは約 1.33 MB のテキストになり、MIME のメールでは 76 文字ごとに改行が入るため、増加分はさらに少し大きくなります。

Base64 が使われている場所

  • メールの添付ファイル:初期のメールシステムは 7 ビットのテキストしか運べなかったため、MIME はファイルを Base64 でエンコードします。
  • データ URL:HTML や CSS に埋め込む小さな画像で、data:image/png;base64,iVBORw0KGgo... のように書きます。
  • 画像、鍵、証明書などのバイナリデータを運ぶ必要がある JSON や XML の API。
  • JSON Web Token(JWT):ヘッダーとペイロードは Base64url でエンコードした JSON です。
  • TLS 証明書や鍵の PEM ファイル:-----BEGIN CERTIFICATE----- などの行の間に Base64 を挟んでいます。
  • HTTP Basic 認証:username:password を Base64 でエンコードして送ります。

画像をデータ URL として埋め込むとネットワークリクエストが1回減りますが、サイズが 33% 増え、個別にキャッシュできなくなります。そのため、効果があるのはふつうごく小さな画像だけです。

Base64 と Base64url、その他のエンコード

標準の Base64 は + と / を使いますが、これらは URL やファイル名で特別な意味を持ちます。同じ RFC にある URL セーフ版は、これらを - と _ に置き換え、= のパディングを省略することもよくあります。

エンコード使う文字サイズの増加用途の例
Base16(16進数)0–9、A–F100%ハッシュ、カラーコード
Base32A–Z、2–760%二要素認証のシークレット
Base64A–Z、a–z、0–9、+、/33%メール、データ URL、PEM
Base64urlA–Z、a–z、0–9、-、_33%JWT、URL パラメーター

よくある間違い

  • テキストはまずバイト列に変換する必要があり、通常は UTF-8 を使います。JavaScript の btoa() は、文字列を先に UTF-8 でエンコードしておかないと、絵文字や漢字など Latin-1 の範囲外の文字でエラーを投げます。
  • 標準の文字セットと URL セーフの文字セットを混ぜるとデコードエラーになります。標準のデコーダーを使う前に - と _ を + と / に置き換えましょう。
  • パディングがないと、厳密なデコーダーでは失敗することがあります。長さが 4 の倍数になるまで = を追加しましょう。
  • メール形式のエンコードで入った改行は、取り除かないと受け付けないデコーダーもあります。

よくある質問

Base64 でデータが大きくなるのはなぜですか?

3 バイトが4文字になり、各文字が丸ごと 1 バイトとして保存されるため、出力は入力より約 33% 大きくなります。

Base64 は安全ですか?

いいえ。何も隠しておらず、デコードに鍵は要りません。データを守るには AES などの本物の暗号化を使い、Base64 はその結果をテキストとして運ぶためだけに使いましょう。

Base64 の末尾の = は何を意味しますか?

パディングです。= が1つなら最後のグループは 2 バイト、== なら 1 バイトしかなかったことを示します。

Base64 の文字列はどう見分けますか?

英字、数字、+ と /(または - と _)だけでできていて、長さはたいてい 4 の倍数で、末尾に = が1つか2つ付くことがあります。eyJ で始まる文字列は Base64 でエンコードした JSON であることが多く、これは {" で始まる JSON テキストをエンコードすると eyJ で始まる文字列になるためです。

基礎知識の記事一覧