Base64の行折り返し(76文字)

MIME Base64における76文字の行長制限について解説。この制限が存在する理由、使うべき場面、各実装での行折り返しの扱い方を紹介します。

Format

詳細な説明

MIME形式のBase64(RFC 2045)では、エンコード出力が76文字以内の行に折り返され、各行がキャリッジリターンとラインフィード(CRLF、\r\n)で終端されます。これはメールや特定のレガシープロトコルにとって重要なフォーマットルールですが、現代のWeb利用では不要です。

なぜ76文字なのか?

SMTPプロトコル(RFC 5321)は最大行長を998文字(CRLF除く)と規定しています。元のSMTP RFC(821、1982年)は78文字を推奨していました。MIME設計者は76文字を選び、CRLF行終端のための余裕を持たせ、最も古く制限の厳しいメールサーバーとも互換性を保つようにしました。

折り返しあり vs 折り返しなしの例:

折り返しなし(現代のWeb利用):

SGVsbG8gV29ybGQhIFRoaXMgaXMgYSBsb25nZXIgc3RyaW5nIHRoYXQgd2lsbCBwcm9kdWNlIG1vcmUgdGhhbiA3NiBjaGFyYWN0ZXJzIG9mIEJhc2U2NCBvdXRwdXQu

折り返しあり(MIME形式):

SGVsbG8gV29ybGQhIFRoaXMgaXMgYSBsb25nZXIgc3RyaW5nIHRoYXQgd2ls
bCBwcm9kdWNlIG1vcmUgdGhhbiA3NiBjaGFyYWN0ZXJzIG9mIEJhc2U2NCBv
dXRwdXQu

各実装での折り返し処理:

Python:

import base64
# No wrapping (standard)
base64.b64encode(data)
# With MIME wrapping (76 chars + \n)
base64.encodebytes(data)

Java:

// No wrapping
Base64.getEncoder().encodeToString(data);
// With MIME wrapping (76 chars + \r\n)
Base64.getMimeEncoder().encodeToString(data);
// Custom line length
Base64.getMimeEncoder(64, "\r\n".getBytes()).encodeToString(data);

OpenSSL(コマンドライン):

# Default: wraps at 76 characters
openssl base64 -in file.bin
# No wrapping
openssl base64 -A -in file.bin

折り返しBase64を使うべきケース:

  • MIMEメールメッセージの構築
  • PEM形式の証明書と鍵(76文字ではなく64文字の行を使用)
  • 行長制限を課すレガシーシステム

折り返しなしBase64を使うべきケース:

  • Web API(JSONペイロード、HTTPヘッダー)
  • HTML/CSSのdata URI
  • データベースへの格納
  • 現代のアプリケーション全般

折り返しBase64のデコード: ほとんどのデコーダーはBase64入力中の空白(改行を含む)を暗黙的に無視します。ただし、厳密なデコーダーはそうしません。MIME形式のBase64を受け取った場合、デコード前にすべての空白を削除するのが最も安全です:

const cleaned = mimeBase64.replace(/\s/g, "");
const decoded = atob(cleaned);

ユースケース

PEM形式のSSL証明書を生成する際、Base64エンコードされた証明書本体がBEGINとENDマーカーの間で64文字ごとに折り返される必要がある場合に使用します。

試してみる — Base64 Encoder

フルツールを開く