用語辞典・データ・文字コード

Base64

Base64とは

Base64(ベース64)は、バイナリデータを64種類の文字で表し、テキストとして扱えるようにする符号化方式です。画像、鍵材料、メール添付、API内の小さなバイナリなどを、文字だけを通しやすい経路へ載せるときに使います。

標準の字母は英大文字26、英小文字26、数字10、+/の計64種類です。末尾をそろえるため=をパディングとして使う場合があります。

Base64は暗号化でも圧縮でもありません。誰でも元のバイトへ戻せ、通常は元データより約3分の1長くなります。

3バイト24ビットを、6ビットずつ4個へ分け直す文字だけの経路を通した後、同じバイトへ復元する
画像と荷物のバイナリデータを三つの空白ブロックから四つの色タイルへ組み替えて細い通信経路を通し、同じ画像と荷物へ復元する流れ、末尾の埋め合わせ、Web用とファイル名用の字母、容量増加、暗号ではないこと、欠損による破損を示すピクトグラム図解
図1図の四角は入力バイト、色付きタイルはBase64文字を表します。文字の見た目を変えても、元データの内容は秘匿されません。

3バイトを4文字へ組み替える

Input24ビットを集める

連続する3バイトを一組として扱います。

Split6ビットずつ分ける

24ビットを4個の6ビット値へ組み替えます。

Map64文字へ対応付ける

各6ビット値を字母表の一文字へ変えます。

Output4文字として送る

復号側は逆順で元の3バイトを取り戻します。

パディングは末尾の不足を示す

入力長が3の倍数でなければ最後の組が足りません。1バイト余ると通常==、2バイト余ると=を末尾へ付け、最後に有効な情報がどこまであるかを示します。

仕様によっては長さが別に分かるためパディングを省略できます。受信側がパディング必須か省略可かを取り決めずに削除すると、厳格なデコーダーで拒否されます。

標準Base64とBase64url

base64url(ベース64ユーアールエル)は、URLやファイル名で扱いにくい+/を、それぞれ-_へ置き換えた字母です。JWTなどで使われます。パディングを省略する仕様もあります。

二つは似ていますが、字母とパディング規則を黙って混在させません。「Base64」とだけ記録せず、標準かURL-安全か、改行とパディングをどう扱うかを明示します。

容量は増え、圧縮にはならない

3バイトが4文字になるため、本体はおおむね4/3倍になります。さらにJSONの引用符、メールの改行、データURLの接頭辞が加わります。巨大ファイルをAPIのJSONへ埋め込むと、メモリ使用量と転送量が増えます。

大きなファイルはマルチパート送信、オブジェクトストレージへの直接アップロード、ストリーミングなどを検討します。圧縮するなら、Base64化する前にバイナリを圧縮します。

改行と不要文字の扱い

RFC 4648の基本規則では、参照する上位仕様が指示しない限り、エンコーダーが勝手に改行を挿入しません。MIMEメールでは歴史的な行長規則に従って折り返す場合があります。

デコーダーが空白や字母以外の文字を無視するか、厳格に拒否するかも用途で違います。署名値や認証情報では、許容範囲の差によって別の文字列が同一視されないよう、canonical form(カノニカル・フォーム/正規形)を決めます。

暗号化・ハッシュ・圧縮との違い

Base64文字列は復号鍵なしで元へ戻せます。パスワード、APIキー、個人情報をBase64にしただけでは保護になりません。通信はHTTPSなどで暗号化し、保存時も目的に合う暗号化とアクセス制御を使います。

ハッシュは通常元へ戻せない一方向の要約、圧縮は情報を保ったままサイズを減らす処理です。Base64は「バイト列を限定した文字集合で表し直す」可逆の符号化です。

使われる場所

メール添付では、MIMEのContent-Transfer-Encodingとしてバイナリを安全な文字列へします。JSONの文字列へ小さなバイナリを入れる場合や、データURL、Basic認証の資格情報表現にも現れます。

用途ごとに「何をBase64化したか」が違います。文字列なら先にUTF-8などでバイト列へし、そのバイトをBase64化します。復号後も、どの文字エンコーディングで文字へ戻すかが必要です。

Base64は3バイトを4文字へ表し直す可逆の符号化です。標準とBase64url、パディング、改行規則を区別し、暗号化や圧縮の代わりには使いません。

字母・padding・改行・canonical encoding:RFC 4648

関連用語