ソフトウェアの世界で最もよくある誤解の一つです。cGFzc3dvcmQ= のような文字列を見て、データが「暗号化されている」と思い込む——実はそうではありません。Base64 はエンコードであって暗号化ではなく、この二つを混同すると本当のセキュリティ上のミスにつながります。はっきりさせましょう。
主張ではなく証拠を出します。 JWT 公式ドキュメントの見本トークンを私たちの JWT デコーダーに貼ってください。鍵を一切与えていないのに、即座にこう表示されます。
{ "alg": "HS256", "typ": "JWT" } { "sub": "1234567890", "name": "John Doe", "iat": 1516239022 }このトークンのペイロードは Base64url であり、Base64 はアルファベットが公開された転送用エンコードです。秘密は一切関与しないので、そうやって符号化されたものは、その気になれば誰でも読めます。鍵が必要なのは署名だけで、署名が守るのは改竄であって閲覧ではありません。機密を Base64 文字列に入れて「保護した」と言ってはいけません。
Base64 が実際にすること
Base64 は任意のバイト列を 64 種類の印字可能な文字(A–Z、a–z、0–9、+、/)で表現します。目的は転送です。バイナリや特殊文字を、テキストしか扱えない経路——メール本文、JSON フィールド、Data URI、JWT のセグメントなど——で運べるようにします。
重要なのは、Base64 には鍵も秘密もないことです。誰でも一瞬で元に戻せます。試しに cGFzc3dvcmQ= を Base64 ツールに貼り付けると、すぐに password が返ってきます。
この主張を出力として示します。各行は私たちの Base64 エンコーダーを通したものです。右側のどれかを同じページに貼り戻してデコードに切り替えれば、左の列がそのまま戻ります。どこにも鍵は関与しません。鍵を置く場所すら存在しません。
| 入力 | Base64 |
|---|---|
secret | c2VjcmV0 |
admin:password | YWRtaW46cGFzc3dvcmQ= |
{"role":"admin"} | eyJyb2xlIjoiYWRtaW4ifQ== |
Hello, World! | SGVsbG8sIFdvcmxkIQ== |
エンコード vs 暗号化
| エンコード(Base64) | 暗号化 | |
|---|---|---|
| 目的 | データを安全に転送する | データを他者に読めなくする |
| 鍵/秘密 | なし | あり——鍵が必要 |
| 誰でも復元できる? | はい、簡単に | いいえ、鍵を持つ者だけ |
| 機密性を提供? | ❌ いいえ | ✅ はい |
エンコードは表現の話、暗号化は秘匿の話です。両者はまったく別の問題を解決します。
2 行目は作り話ではありません。HTTP Basic 認証が送っているのはまさにこれです。admin:password は YWRtaW46cGFzc3dvcmQ= になり、ヘッダーは Authorization: Basic YWRtaW46cGFzc3dvcmQ= と書かれます。そのリクエストを見られる人は誰でもパスワードを読めます。だから Basic 認証は TLS の上でしか許容されません。機密性は輸送層が与えるもので、エンコードは何も与えません。3 行目は同じ誤りの別の衣装です。eyJyb2xlIjoiYWRtaW4ifQ== は不透明に見えて 1 手で {"role":"admin"} に戻るので、この種の値を cookie に入れるのは、利用者が自分に権限を発行できるという意味になります。
関連概念:ハッシュ
Base64 とハッシュも混同されがちです。ハッシュ(SHA-256 など)は一方向関数で、出力から入力を復元できません。完全性チェックやパスワード保存に使われ、転送用ではありません。実験するなら、当サイトのハッシュ生成ツールで、同じ入力が常に同じ固定長の指紋を生む様子を確認できます。
つまり 3 つの異なる概念があります:
- エンコード(Base64):誰でも復元可能、転送用。
- ハッシュ(SHA-256):一方向、完全性用。
- 暗号化(AES、RSA…):鍵を持つ者だけ復元可能、秘匿用。
避けるべきセキュリティのミス
パスワード、API キー、その他機密の値を「隠す」ために Base64 を使ってはいけません。簡単に復元できるため、機密の保護はゼロです。機密性が必要なら本物の暗号化(例:通信は TLS、保存は AES)を使い、認証情報は適切に保管してください。
それが暗号かどうかを見分ける便利な検査があります。「何が秘密である必要があるか」と問うことです。c2VjcmV0 については何もありません。アルゴリズムは公開、文字表も公開、保護すべき鍵パラメータも存在しません。秘密のない暗号は暗号ではなく、同じデータの別の綴りです。
Base64 が適している場面
バイナリや特殊データを正当にテキスト経路で運ぶ必要があるとき、Base64 は最適です:
- 小さな画像を Data URI として HTML や CSS に埋め込む。
- JWT の各セグメントを確認・組み立てる。
- JSON API でバイナリデータを渡す。
- 特殊文字を値に安全に含める。
得意なこと——表現——に使い、秘匿が必要なときは暗号化を選びましょう。UTF-8 に完全対応した無料・ブラウザ動作の Base64 ツールでエンコード・デコードできます。