Base64とは?仕組み・暗号化との違い・よくある使い方をわかりやすく解説

Base64とは?
hiro

API の仕様書やメールのソース、JWT などで「SGVsbG8=」のような英数字の文字列を見かけたことはないでしょうか。これは Base64 という方式で変換されたデータです。

この記事では、Base64 の仕組みを具体例で説明したうえで、暗号化との違いや、開発の現場でのよくある使い方、コマンドやプログラムでの変換方法を解説します。

すぐに変換したい場合は、ブラウザだけで使える「Base64 エンコード・デコードツール」をご利用ください。

Base64とは?

Base64(ベースろくじゅうよん)は、画像や日本語などのデータを、英大文字・英小文字・数字・「+」「/」の 64 種類の文字だけで表す変換方式です。規格は RFC 4648 で定められています。

メールや URL、JSON のように「決まった文字しか安全に扱えない」場所で、どんなデータでも壊さずに受け渡せるようにするために使われます。データを Base64 に変換することを「エンコード」、元に戻すことを「デコード」と呼びます。

変換の仕組み

Base64 は、データを 3 バイト(24 ビット)ずつ区切り、それを 6 ビットずつ 4 つに分けて、それぞれを 64 種類の文字のどれかに置き換えます。「Man」という 3 文字を例にすると、次のようになります。

  1. 「M」「a」「n」を 2 進数にすると「01001101 01100001 01101110」(24 ビット)
  2. これを 6 ビットずつに区切ると「010011 010110 000101 101110」
  3. それぞれを 10 進数にすると「19」「22」「5」「46」
  4. 対応表で文字に置き換えると「T」「W」「F」「u」となり、結果は「TWFu」

対応表は、0〜25 が「A〜Z」、26〜51 が「a〜z」、52〜61 が「0〜9」、62 が「+」、63 が「/」です。

末尾の「=」(パディング)とサイズ

3 バイトが 4 文字になるため、変換後のサイズは元の約 1.33 倍になります。データの長さが 3 の倍数でないときは、末尾に「=」を付けて 4 文字単位にそろえます。この「=」をパディングと呼びます。たとえば「Hello」(5 バイト)は「SGVsbG8=」になります。

URL-safe Base64 とは

通常の Base64 で使う「+」と「/」は、URL の中では特別な意味を持つ文字です。そこで、これらを「-」と「_」に置き換えたものが URL-safe Base64(Base64URL)です。JWT(JSON Web Token)や URL のパラメータで使われ、末尾の「=」も省略されることがよくあります。

Base64 は暗号化ではない

Base64 の文字列は一見すると意味のない文字の並びですが、鍵がなくても誰でも簡単に元に戻せるため、暗号化の代わりにはなりません。パスワードや個人情報を Base64 にしただけで保存・送信するのは危険です。

エンコード・暗号化・ハッシュの違い

よく混同される 3 つの違いを整理すると、次のようになります。情報セキュリティマネジメント試験や応用情報技術者試験でも問われる重要なポイントです。

種類代表例元に戻せるか目的
エンコードBase64誰でも戻せる(鍵は不要)データを扱いやすい形式に変える
暗号化AES、RSA鍵を持つ人だけが戻せる内容を秘密にする
ハッシュSHA-256戻せない改ざんの検知、データの同一性の確認

秘密にしたいデータは、AES などの暗号化や HTTPS 通信で保護します。また、パスワードを保存するときは、SHA-256 のような汎用のハッシュではなく、bcrypt や Argon2 といったパスワード保存専用の方式を使うのが基本です。

Base64 のよくある使い方

画像を HTML や CSS に直接埋め込む(data URI)

小さなアイコンなどを Base64 にすると、画像ファイルを別に用意せず HTML や CSS に直接書き込めます。

<img src="data:image/png;base64,iVBORw0KGgo..." alt="アイコン">

ただし、サイズが約 1.33 倍になり、ブラウザのキャッシュも効きにくくなります。数 KB 程度の小さな画像に限って使うのがおすすめです。

Basic 認証のヘッダー

HTTP の Basic 認証では、「ユーザー名:パスワード」を Base64 にしたものをヘッダーに入れて送ります。たとえば「user:pass」は「dXNlcjpwYXNz」になります。

Authorization: Basic dXNlcjpwYXNz

このヘッダーは誰でもデコードしてパスワードを読めるため、Basic 認証は必ず HTTPS と組み合わせて使います。

JWT の中身を確認する

JWT は「ヘッダー.ペイロード.署名」の 3 つを「.」でつないだ形式で、それぞれが URL-safe Base64 で表されています。たとえば先頭の「eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9」をデコードすると、次の JSON になります。

{"alg":"HS256","typ":"JWT"}

デコードで中身は確認できますが、署名が正しいかどうかは確認できません。また、ペイロードは誰でも読めるため、JWT に秘密の情報を入れてはいけません。

メール・API・設定ファイルでのデータ受け渡し

  • メールの添付ファイル:添付ファイルは Base64 にしてメール本文と一緒に送られます。
  • JSON の API:JSON は文字しか扱えないため、画像などのバイナリは Base64 にして入れます。
  • Kubernetes の Secret:値は Base64 で書きますが、これは暗号化ではありません。Secret の内容は、アクセス権限の設定や暗号化の機能で別に守る必要があります。

コマンドやプログラムで変換する方法

Linux・macOS(base64 コマンド)

エンコードするコマンドです。実行すると「SGVsbG8=」と表示されます。

echo -n 'Hello' | base64

デコードするコマンドです。実行すると「Hello」と表示されます。

echo 'SGVsbG8=' | base64 -d

echo に -n を付け忘れると、末尾の改行まで変換されて「SGVsbG8K」という別の結果になります。よくある間違いなので注意しましょう。

Python

標準ライブラリの base64 モジュールを使います。次のコードをファイルに保存して実行すると、結果が表示されます。

import base64

encoded = base64.b64encode("Hello".encode("utf-8")).decode("ascii")
print(encoded)  # SGVsbG8=

decoded = base64.b64decode(encoded).decode("utf-8")
print(decoded)  # Hello

# URL-safe 形式
print(base64.urlsafe_b64encode(b"??>"))  # b'Pz8-'

Windows(PowerShell)

エンコードするコマンドです。実行すると「SGVsbG8=」と表示されます。

[Convert]::ToBase64String([Text.Encoding]::UTF8.GetBytes("Hello"))

デコードするコマンドです。実行すると「Hello」と表示されます。

[Text.Encoding]::UTF8.GetString([Convert]::FromBase64String("SGVsbG8="))

まとめ

  • Base64 は、どんなデータも 64 種類の文字で表す変換方式
  • 3 バイトを 4 文字に変換するため、サイズは約 1.33 倍になる
  • 誰でも元に戻せるので、暗号化の代わりにはならない
  • data URI、Basic 認証、JWT、メール、API など、開発の現場で幅広く使われている

関連する記事・ツール

ABOUT ME
記事URLをコピーしました