Base64は、バイナリデータや特殊文字を含むデータを、テキストとして安全に扱えるように変換するエンコード方式です。
メールやJSON、URLなど文字だけが想定された場面で便利に使われます。
この記事では、Base64の考え方から仕組み、具体的な手順、使いどころと注意点までを初心者向けにやさしく説明します。
Base64の基本
Base64とは何か
Base64は、0〜255の値を持つバイト列(バイナリデータ)を、64種類の決まった文字だけで表現する方法です。
3バイト(24ビット)のデータを4文字に置き換える規則により、どんなバイナリでもテキスト化できます。
これにより、テキスト前提のプロトコルやフォーマットでも安全にデータを運べるようになります。
Base64はあくまで「表現の変換」であり、意味や内容を変えません。
人間に読ませるためではなく、システム間での安全なやり取りに向いています。
エンコードとデコードの違い
エンコードは「元のバイト列」から「Base64文字列」に変換すること、デコードはその逆に戻すことです。
エンコードとデコードは可逆であり、情報は失われません。
ただし、変換前の文字列データはどの文字コード(例: UTF-8)でバイト列にしたかが結果に影響します。
なぜBase64を使うのか
ネットワークやファイル形式によっては、制御文字や非ASCII文字が扱いにくい場合があります。
Base64にしておけば、メール本文、JSON、XML、URLパラメータなど「テキストのみ安全」な場所でもバイナリを滑らかに運べます。
その代わり、データはやや長くなります。
具体例
画像やPDFなどの添付、APIでのバイナリの受け渡し、HTMLのdata URL、JWTの内部表現などが代表例です。
Base64の仕組み
3バイトを4文字にする仕組み
コンピュータは基本的にバイト(8ビット)単位でデータを扱います。
Base64では、3バイト=24ビットをまとめて、6ビットずつ4つに分け、各6ビットの値(0〜63)を文字に対応づけます。
こうして3バイトが4文字に変わります。
6ビットとは
6ビットは2の6乗で64通りの値を表せます。
これが「64文字」の由来です。
使用する文字セット
Base64で使う64文字は固定です。
数字や記号を含みますが、いずれもテキストで安全に扱える文字です。
インデックス0〜63を次の範囲に対応づけます。
| 範囲 | 文字 |
|---|---|
| 0〜25 | A〜Z |
| 26〜51 | a〜z |
| 52〜61 | 0〜9 |
| 62 | + |
| 63 | / |
入力の文字コードに注意
文字列をBase64化する前に、必ず文字列を特定の文字コードでバイト列にします(一般にはUTF-8)。
文字コードを間違えると、同じ文字列でも違うBase64になります。
画像などのバイナリはそのままのバイト列を使います。
パディング(=)の意味
データ長が3の倍数でない場合、最後のブロックは24ビットに満たないため、足りないビットを0で埋めたうえで、出力末尾に「=」を付けて長さの調整をします。
余りが1バイトなら「==」、2バイトなら「=」を付けます。
3バイトぴったりなら「=」は不要です。
| 余りのバイト数 | 追加パディング | 備考 |
|---|---|---|
| 0 | なし | 3の倍数ちょうど |
| 1 | == | 8ビット→実質12ビット分を0埋め |
| 2 | = | 16ビット→実質8ビット分を0埋め |
「=」は内容の一部ではなく、長さ合わせの印です。
URL Safe Base64の違い
URLやCookieでは「+」や「/」が特別な意味を持つため、URL Safe Base64(Base64url)では「+」を「-」、「/」を「_」に置き換えます。
また、末尾の「=」パディングを省略する実装もあります。
| 通常Base64 | URL Safe Base64 |
|---|---|
| + | – |
| / | _ |
| 末尾の= | 省略されることがある |
文字の置き換え以外の仕組みは同じです。
エンコードの流れを手順で理解
基本の流れは常に同じです。
次の順に進みます。
- 文字列なら文字コード(例: UTF-8)でバイト列にする。
- 3バイトずつ取り出す。
- 24ビットを6ビット×4に分割する。
- 6ビット値を64文字表で文字に置き換える。
- 余りがあれば0埋めし、末尾に「=」を付ける。
Base64のエンコード手順と例
手順1 バイト列をまとめる
入力が文字列なら、まずUTF-8などの文字コードでバイト列に変換します。
画像やPDFなどはすでにバイト列なのでそのまま使います。
手順2 6ビットごとに分割
3バイト(24ビット)をまとめ、左から6ビットずつ区切って4つのグループにします。
足りないビットは右側に0を足して24ビットにします。
手順3 64文字表に置き換え
各6ビットの数値(0〜63)を、先ほどの文字セット表で文字に変換します。
4つの6ビット値から4文字のBase64文字列が得られます。
手順4 余りはパディング(=)で調整
データの終端で3の倍数にならない場合、出力末尾に「=」または「==」を付けて、全体の文字数を4の倍数にそろえます。
例 Hello → SGVsbG8=
ここではASCIIの「Hello」をUTF-8として扱います(同じです)。
文字のバイト値は H=0x48、e=0x65、l=0x6C、l=0x6C、o=0x6F です。
前半ブロック Hel
3バイト「H e l」をまとめます。
24ビット→6ビット×4に分割して対応文字に変換します。
| 対象 | 8ビット列 | 6ビット区切り | 10進数 | Base64文字 |
|---|---|---|---|---|
| Hel | 01001000 01100101 01101100 | 010010 000110 010101 101100 | 18, 6, 21, 44 | S, G, V, s |
結果は「SGVs」です。
後半ブロック lo
余りは2バイト「l o」です。
24ビットに満たないため、右に0を足してから変換し、最後の1文字はパディング「=」に置き換えます。
| 対象 | 8ビット列(+0埋め) | 6ビット区切り | 10進数 | Base64文字 |
|---|---|---|---|---|
| lo | 01101100 01101111 00000000 | 011011 000110 111100 000000 | 27, 6, 60, 0 | b, G, 8, = |
結果は「bG8=」になります。
結合
前半「SGVs」と後半「bG8=」を結合して、最終結果は「SGVsbG8=」です。
デコードの基本手順
デコードは逆方向です。
4文字ずつ取り、各文字を6ビット値に戻し、24ビットに結合してから8ビットごとに3バイトへ戻します。
「=」はパディングの目印なので、対応する0埋めを考慮して捨てます。
URL Safeでは「-」→「+」、「_」→「/」に戻し、必要なら足りない分の「=」を補います。
Base64の使い方と注意点
よく使う場面
メールの添付(MIME)、JSONやXMLでのバイナリ受け渡し、HTMLのdata URL、JWTのヘッダーとペイロード(Base64url)、認証ヘッダーの一部(例: Basic認証のユーザー名とパスワードの連結)などで使われます。
「テキストしか通せない場所にバイナリを通す」ための実用手段です。
プログラミングでの使い方の基本
多くの言語に標準ライブラリがあり、文字列→バイト列→Base64文字列の順で処理します。
デコードは逆です。
特に、文字列を扱うときは必ず文字コード(UTF-8など)でバイト列に変換してください。
| 言語 | エンコードの例 | デコードの例 | 備考 |
|---|---|---|---|
| JavaScript(ブラウザ) | btoa(文字列) | atob(文字列) | 非ASCIIは事前にUTF-8化が必要 |
| Node.js | Buffer.from(str, ‘utf8’).toString(‘base64’) | Buffer.from(b64, ‘base64’).toString(‘utf8’) | バイナリもBufferで扱える |
| Python | base64.b64encode(bytes) | base64.b64decode(b64) | urlsafe版はbase64.urlsafe_b64encode |
| Java | Base64.getEncoder().encodeToString(bytes) | Base64.getDecoder().decode(b64) | URL用はgetUrlEncoder |
| Go | base64.StdEncoding.EncodeToString(b) | base64.StdEncoding.DecodeString(s) | URL用はURLEncoding |
いずれも入力は「バイト列」、出力は「文字列」になる点を意識しましょう。
サイズが増える
Base64は3バイトが4文字になるため、データ量は約4/3倍(約33%)に増えます。
長いデータほど差が大きくなるので、保存や通信量に注意が必要です。
おおよその長さは 4×ceil(N/3) 文字(Nはバイト数)で見積もれます。
暗号化ではない
Base64は暗号化ではありません。
安全性を高める効果はなく、誰でも簡単に元に戻せます。
機密情報には暗号化方式(AESなど)を使い、必要に応じて鍵管理や認証を組み合わせてください。
文字化け対策ではない
Base64は文字化けそのものを直す道具ではありません。
文字化けの原因は送受信側の文字コード不一致です。
テキストを扱う際はUTF-8などの文字コードを統一し、そのうえで必要ならBase64で運搬します。
いつ使わないべきか
Base64は便利ですが万能ではありません。
次のような場合は他の方法を検討します。
目的が「可搬性」ではなく「効率」や「秘匿」なら不向きです。
- 大容量のバイナリを長期保存する場合(サイズ増と処理コストが無駄)。
- 機密データの保護が目的の場合(暗号化ではない)。
- URLを極力短くしたい場合(Base64は長くなりやすい)。
- そもそもテキストで安全に扱えるデータを無理にBase64化する場合(利点が少ない)。
まとめ
Base64は、任意のバイナリを64種類の文字へ写像してテキストとして安全に扱えるようにする仕組みです。
3バイト→4文字、6ビット単位、必要に応じて「=」でパディング、というルールさえ押さえれば、エンコードとデコードの流れは明快です。
URL Safe Base64では「+」「/」の置き換えと「=」省略の可能性に気を付けましょう。
サイズは約33%増えるため、「テキストしか通せない場面で使う」ことが本来の目的です。
暗号化や文字化け対策の代替ではない点も忘れずに、適材適所で役立ててください。
