Base64は、すべての開発者が使ったことがあるが、Fewが説明 without 停止できる.formatの1つです。ランダムな文字に見えます。データを大きくします。それなのに、メール添付ファイル、JWTペイロード、CSSのインライン画像、テキスト専用チャネルでバイナリデータを移動する必要がある数十の他のプロトコルの背骨です。
短いバージョン:Base64は任意のバイナリデータを印刷可能なASCII文字としてエンコードします。 長いバージョンには64文字のアルファベット、パディングルール、そして本番環境で人々を惑わすいくつかのバリアントが含まれます。
なぜBase64が存在するのか
多くのシステムはテキストのみの転送用に設計されました — メール(SMTP)、URL、XML、JSON。これらのパイプの1つを通じてバイナリファイルを送信したい場合、バイトを文字として表現する方法が必要です。Base64は、入力の3バイトごとに出力の4文字にマッピングすることで、実質的にすべてのテキストプロトコルで安全な文字のみを使用してこれを解決します。
トレードオフ:Base64はデータサイズを約33%増加させます。 1KBの画像は約1.3KBのテキストになります。ほとんどのユースケースでは問題ありません。ハイスループットシステムでは重要で、Base85や生のバイナリプロトコルなどの代替手段が見られます。
64文字
アルファベットは:
A-Z (26文字)
a-z (26文字)
0-9 (10文字)
+ / (2文字)
合計64文字、名前の由来です。入力長が3バイトの倍数でない場合、=文字がパディングに使用されます。
アルファベットの各文字は印刷可能なASCIIであり、Base64出力はメールを通過し、JSON文字列に出現し、HTML属性内に配置し、生のバイナリを破損する可能性のあるシステムを生き延びることができます。
エンコーディングの仕組み
3バイトの入力を取得します。各バイトは8ビットなので、合計24ビットです。Base64はそれらの24ビットを4つの6ビットグループに分割します。各6ビットグループはアルファベットの1文字にマッピングされます:
000000→A000001→B- …
111111→z
それだけです。エンコーディングはキー、ソルト、秘密なしの単純なビットレベル変換です。誰もがルックアップテーブルを逆にしてBase64をデコードできます。
パディング
入力長が3の倍数でない場合、パディングで埋めます:
- 1バイト残り → 2つのBase64文字 +
== - 2バイト残り → 3つのBase64文字 +
= - 0バイト残り → パディングなし
パディング文字はデータを伝えません。出力長が常に4の倍数になるように存在します、多くのパーサーが期待します。
バリアント
すべてのBase64が同一ではありません:
- 標準Base64(
A-Za-z+/=) — デフォルト、MIMEメールとほとんどのプロトコルで使用。 - URL安全なBase64(
A-Za-z-_) —+を-、/を_に置き換え、パディングを削除。JWT、URLパラメータ、ファイル名で使用。 - パディングなしBase64 — 一部のシステムは
=文字を省略します。出力は短くなりますが、一部のパーサーは失敗します。
JWTやデータURIをデバッグしていてデコードが失敗した場合、最初にチェックすべきことは、エンコーデラーがURL安全なBase64を使用したか標準Base64を使用したかです。標準Base64文字列と予想したものの途中に-があることが判明です。
開発者がBase64に実際に出会う場所
メール添付ファイル。 MIME(RFC 2045)はバイナリ添付ファイルをエンコードするためにBase64を使用します。ランダムな文字の長い文字列を持つ.emlファイルを見たことがあるなら、それはBase64エンコードされたコンテンツです。
JWTペイロード。 JWTの3つの部分(ヘッダー、ペイロード、署名)はそれぞれURL安全にBase64エンコードされています。JWTをデコードする際、各セグメントのBase64urlエンコーディングを逆にしています。
データURI。 data:image/png;base64,iVBOR...で、画像をHTMLやCSSに直接インラインで配置できます。画像のバイトはテキスト属性に表示できるようにBase64エンコードされています。
API。 一部のAPIはBase64エンコードされたバイナリデータを受け付けたり返したりします(ファイルアップロード、画像処理、暗号署名)。ほとんどのAPIがマルチパートフォームデータをサポートするようになって以来あまり一般的ではありませんが、まだ現れます。
埋め込み。 機械学習モデルは埋め込みをJSONのBase64文字列として保存することがあります。パフォーマンスには最適ではありませんが、転送には便利です。
Base64を使用すべきでない場合
暗号化として使用しないでください。 Base64はエンコーディングであり、暗号化ではありません。誰でもデコードできます。機密データをBase64に置くと、隠すだけで保護していません。
圧縮として使用しないでください。 Base64はデータを大きくします、小さくしません。既に圧縮されたデータ(.gzファイルなど)をBase64エンコードすると、メリットなしにオーバーヘッドを追加します。
パフォーマンスに敏感なパスで使用しないでください。 エンコーディング/デコードはCPU時間を追加し、ペイロードサイズを増加させます。高頻度の内部APIには、代わりにバイナリプロトコル(protobuf、msgpack)を使用してください。
バリアントを忘れないでください。 URLやJWT用にBase64を生成する場合は、URL安全なBase64を使用してください。メールや一般的な転送用に生成する場合は、標準Base64を使用してください。混在させると、サイレントなデータ破損が発生します。
クイックリファレンス
| シナリオ | バリアント | パディング |
|---|---|---|
| JWT | URL安全 | いいえ |
| メール / MIME | 標準 | はい |
| データURI | 標準 | オプション |
| URLパラメータ | URL安全 | いいえ |
| 一般的な転送 | 標準 | はい |
試してみる
デコードするBase64文字列や、エンコードする必要があるバイナリデータがある場合は、ブラウザベースのツールを使用して、変換がローカルで行われるようにしてください — 如此簡単なことのためにデータをサーバーに送信しません。