メインコンテンツまでスキップ

1. 導入

データの基数エンコーディングは、おそらく歴史的な理由により US-ASCII [1] データに制限されている環境で、データを保存または転送するために多くの場面で使用されます。また、基数エンコーディングは、歴史的な制限がない新しいアプリケーションでも、テキストエディタでオブジェクトを操作できるようにするためだけに使用されることがあります。

これまで、異なるアプリケーションは異なる要件を持っていたため、基数エンコーディングをわずかに異なる方法で実装することがありました。今日では、プロトコル仕様が基数エンコーディング、特に "base64" を、正確な説明や参照なしに泛用的に使用することがあります。Multipurpose Internet Mail Extensions(MIME)[4] は、base64 の参照として改行や非アルファベット文字への影響を考慮せずに使用されることがよくあります。本仕様の目的は、共通のアルファベットとエンコーディングに関する考慮事項を確立することです。これにより、他のドキュメントの曖昧さが減り、より高い相互運用性につながることが期待されます。


なぜ基数エンコーディングが必要なのか​

中心的な問題​

多くのレガシーシステムおよびプロトコルはテキストデータ(US-ASCII)しか処理できず、バイナリデータを直接送信できません:

問題のシナリオ:
❌ メールシステム(SMTP)——7 ビット ASCII のみ対応
❌ URL パラメータ——一部の文字は特別な意味を持つ
❌ JSON/XML——バイナリデータを直接埋め込めない
❌ テキストエディタ——バイナリファイルを編集できない

基数エンコーディングによる解決策​

バイナリデータ → 基数エンコーディング → テキストデータ
(非印字) (変換) (印字可能、送信可能)

例:
生データ:[0x48, 0x65, 0x6C, 0x6C, 0x6F] (バイナリ)
Base64: "SGVsbG8=" (テキスト)

歴史的背景と相互運用性の問題​

実装の違いによる問題​

Base64 が標準化される以前、異なる実装の間には違いがありました:

実装行長制限パディング規則アルファベット
MIME76 文字必須標準
PEM64 文字必須標準
いくつかの URL エンコーディング制限なし任意URL 安全

これらの違いにより、以下の問題が発生しました:

  • ❌ システム間のデータ交換の失敗
  • ❌ デコードエラー
  • ❌ セキュリティ脆弱性

RFC 4648 の価値​

本仕様は以下の方法でこれらの問題を解決します:

  1. 統一されたアルファベット——Base64、Base32、Base16 の標準アルファベットを明確に定義
  2. 明確な規則——改行、パディング、不正文字の処理方法を規定
  3. バリエーションの提供——URL 安全な Base64 バリエーションを定義
  4. 相互運用性——異なる実装間の互換性を確保

適用シナリオ​

Base64 の典型的なアプリケーション​

1. メール添付(MIME)
Content-Transfer-Encoding: base64

2. Data URI
data:image/png;base64,iVBORw0KGgo...

3. JWT トークン
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...

4. HTTP Basic 認証
Authorization: Basic dXNlcjpwYXNz

5. XML/JSON へのバイナリデータの埋め込み
{"avatar": "SGVsbG8gV29ybGQ="}

なぜバイナリを直接送信しないのか?​

理由:
1. プロトコル制限——SMTP、HTTP ヘッダは ASCII のみ対応
2. テキストの安全性——制御文字による問題を回避
3. 編集可能性——テキストエディタで閲覧・修正可能
4. 互換性——クロスプラットフォーム・クロスシステムでの送信がより信頼できる

本仕様の目標​

RFC 4648 の目標は以下のとおりです:

✅ 曖昧さの排除——明確で曖昧さのないエンコーディング定義を提供
✅ 相互運用性の向上——異なる実装間の互換性を確保
✅ 選択肢の提供——異なるシナリオに適したエンコーディングバリエーションを提供
✅ セキュリティ上の考慮——セキュリティに関連する実装要件を明確に規定


次のステップ​

以下のセクションでは以下について詳述します:

  • セクション 2:RFC 2119 キーワードの使用規約
  • セクション 3:実装の相違点と推奨される動作
  • セクション 4–8:各種基数エンコーディングの詳細仕様
  • セクション 9–10:例とテストベクトル
  • セクション 12:セキュリティに関する考慮事項