Base64エンコードとは?
Base64エンコードは、データ(通常はバイナリ)をASCII文字セットに変換する方法です。Base64は暗号化でも圧縮でもありませんが、データを隠しているように見えることから暗号化と混同されることがあります。実際、Base64でエンコードされたデータのサイズは元のデータの約1.3333倍になります。
Base64は最も広く使われているBaseエンコード方式で、他によく使われるのはBase16とBase32です。
Base64エンコードは、バイナリデータをプレーンなASCIIテキストに変換する最も一般的な方法の1つです。HTMLマークアップ内の画像やWebリクエストなど、バイナリデータを扱いにくいシステム間の通信に非常に便利なフォーマットです。
Base64の仕組み
データをBase64に変換するには複数のステップがあります。テキスト文字列の場合の仕組みは以下の通りです:
- 入力テキストの8ビットバイナリ表現を計算する
- 8ビットのデータを6ビットずつのチャンクに再グループ化する
- 各6ビットバイナリチャンクの10進数を見つける
- Base64ルックアップテーブルを使って各10進数値のBase64シンボルを見つける
| 値 | 文字 | 値 | 文字 |
|---|---|---|---|
| 0 | A | 32 | g |
| 1 | B | 33 | h |
| 2 | C | 34 | i |
| 3 | D | 35 | j |
| 4 | E | 36 | k |
| 5 | F | 37 | l |
| 6 | G | 38 | m |
| 7 | H | 39 | n |
| 8 | I | 40 | o |
| 9 | J | 41 | p |
| 10 | K | 42 | q |
| 11 | L | 43 | r |
| 12 | M | 44 | s |
| 13 | N | 45 | t |
| 14 | O | 46 | u |
| 15 | P | 47 | v |
| 16 | Q | 48 | w |
| 17 | R | 49 | x |
| 18 | S | 50 | y |
| 19 | T | 51 | z |
| 20 | U | 52 | 0 |
| 21 | V | 53 | 1 |
| 22 | W | 54 | 2 |
| 23 | X | 55 | 3 |
| 24 | Y | 56 | 4 |
| 25 | Z | 57 | 5 |
| 26 | a | 58 | 6 |
| 27 | b | 59 | 7 |
| 28 | c | 60 | 8 |
| 29 | d | 61 | 9 |
| 30 | e | 62 | + |
| 31 | f | 63 | / |
なぜBase64エンコードを使うのか?
バイナリ形式で情報を送信するのは時にリスクがあります。すべてのアプリケーションやネットワークシステムが生のバイナリを扱えるわけではないからです。一方、ASCII文字セットは広く知られており、ほとんどのシステムで簡単に扱えます。
例えば、メールサーバーはテキストデータを期待するため、通常ASCIIが使われます。そのため、画像やその他のバイナリファイルをメールサーバーに送信するには、まずテキストベースのフォーマット(できればASCII)にエンコードする必要があります。ここでBase64エンコードがバイナリデータを適切なフォーマットに変換するのに非常に役立ちます。
Base64の一般的なユースケース
Base64を使って、HTML、JavaScript、CSSと互換性のある方法でバイナリデータを表現することもできます。例えば、Base64を使って画像をCSSやJavaScriptファイルにインラインで埋め込むことができます。
Base64を使ってフォームデータやJSONなどの入力を、URLセーフな縮小文字セットの文字列に変換することも可能です。ただし、一部のサーバーがプラス(+)やスラッシュ(/)文字を特定の方法で解釈する可能性があるため、代わりにencodeURIComponentを使うことを推奨します。
Base64の制限
Base64は決して安全な暗号化方式ではありません。
Base64は圧縮方式でもありません。文字列をBase64にエンコードすると、通常33%長い出力になります。