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文字ごとに折り返される必要がある場合に使用します。