ぱんだツールズぱんだツールズ

技術背景

Base64エンコードとは — 仕組みと使い方をわかりやすく解説

約5分

CSSで画像ファイルを外部から読み込まずにページに埋め込めたり、 メールに添付ファイルが送れたりする——その裏側でBase64というエンコード方式が動いています。 この記事では、Base64の仕組み・生まれた背景・実際に使われている場面、 そして「暗号化とは違う」という重要な誤解を解説します。

Base64とは何か

Base64とは、バイナリデータをASCIIテキストで表現するエンコード方式です。 名前の「64」は使用する文字の種類数を示しています。具体的には次の64文字と、 パディング用の「=」を使います。

  • 大文字アルファベット: A〜Z(26文字)
  • 小文字アルファベット: a〜z(26文字)
  • 数字: 0〜9(10文字)
  • 記号: + と /(2文字)
  • パディング文字: =(3の倍数に合わせる用途)

重要な点として、Base64は暗号化ではありません。 「形式変換(エンコード)」であり、デコード方法は誰でも知っています。 Base64でエンコードされたデータは、誰でも元のバイナリに戻せます。

なぜBase64が生まれたか

Base64が生まれた主な理由は、メールプロトコル(SMTP)の制約にあります。 SMTPはもともとASCIIテキストのみを扱う前提で設計されており、 バイナリデータ(画像・PDFなど)を直接送ることができませんでした。

この問題を解決するために策定されたのがMIME規格(Multipurpose Internet Mail Extensions)です。 MIMEはメールにバイナリの添付ファイルを含められる仕組みで、 その中でバイナリをテキストに変換する手段としてBase64が採用されました。 「添付ファイルが届く」という当たり前の体験は、このMIME + Base64の仕組みに支えられています。

エンコードの仕組み

Base64の変換ルールは明確です。入力3バイト(24ビット)を6ビットずつ4つに分割し、 それぞれを64文字のいずれかに対応させます

具体例として、"Man"という3文字をBase64エンコードすると "TWFu" になります。

文字ASCIIコード(10進)バイナリ(8ビット)
M7701001101
a9701100001
n11001101110

3バイト(24ビット)を連結すると010011010110000101101110になります。これを6ビットずつ分割すると010011010110000101101110となり、それぞれ10進数で 19・22・5・46 → Base64テーブルで T・W・F・u に対応します。

入力の文字数が3の倍数でない場合は末尾に「=」を付けてパディングします。 1文字余った場合は「==」、2文字余った場合は「=」が末尾に付きます。 また、エンコード後のサイズは元データの約4/3倍(約33%増)になります。

実際に使われている場面

用途具体例
メール添付MIME multipart形式でバイナリファイルをテキスト化して送信
HTML/CSSへの画像埋め込みdata:image/png;base64,... 形式のデータURI
HTTP Basic認証Authorization: Basic dXNlcjpwYXNz(user:pass のBase64)
JWTヘッダー・ペイロードをBase64URLエンコードして「.」で区切る
JSON APIでのファイル送信バイナリファイルをBase64にしてJSONのフィールドに含める

Base64は暗号化ではない

Base64でエンコードされたデータは、誰でも元に戻せます。 エンコードとデコードのアルゴリズムは公開されており、秘密鍵も不要です。 見た目がランダムな文字列に変わるため「暗号化されている」と誤解されやすいですが、 情報を秘匿する効果はまったくありません。

特にJWTのペイロードは注意が必要です。eyJ...という文字列はBase64URLエンコードされた平文のJSONであり、誰でも読めます。 JWTの署名は改ざん検知のためにあるものであって、内容の秘匿ではありません。 パスワード・個人情報・機密情報をJWTのペイロードに含めてはいけません。

デコードの方法

JavaScriptを使う場合、組み込み関数でエンコード・デコードができます。

// JavaScript: エンコード

btoa('Man') // "TWFu"

// JavaScript: デコード

atob('TWFu') // "Man"

# コマンドライン: デコード(macOS / Linux)

echo "TWFu" | base64 -d

ブラウザ上で手軽に試したい場合はBase64エンコード/デコードツールを使うと、テキスト・ファイルどちらもワンクリックで変換できます。 URLに安全に使える形式に変換したい場合はURLエンコード/デコードツールも参考にしてください。

まとめ

  • Base64はバイナリをASCIIテキストで表現するエンコード方式(暗号化ではない)
  • 64種類の文字(A-Z・a-z・0-9・+・/)と「=」パディングを使う
  • 3バイト入力 → 6ビット×4 → 4文字出力という変換規則で、サイズは約33%増える
  • メール添付(MIME)・データURI・HTTP Basic認証・JWTなど広く使われている
  • JWTのペイロードは誰でも読めるため、機密情報を含めてはいけない
  • JavaScriptでは btoa() でエンコード、atob() でデコードできる

よくある質問

Base64エンコードとは何ですか?

Base64エンコードとは、バイナリデータ(画像・ファイルなど)を64種類の印字可能なASCII文字(A-Z・a-z・0-9・+・/)で表現するエンコード方式です。メールの添付ファイル・HTMLへの画像埋め込み・HTTP認証ヘッダーなど、テキストしか扱えない仕組みでバイナリを送受信する必要がある場面で広く使われています。

Base64は暗号化の一種ですか?

いいえ、Base64は暗号化ではありません。「形式変換(エンコード)」であり、デコード方法は誰でも知っています。Base64でエンコードしたデータは誰でも元に戻せるため、情報を秘匿する目的には使えません。機密情報を保護するには、AES-256などの暗号化を別途使用してください。

Base64エンコードするとデータサイズはどのくらい増えますか?

Base64エンコード後のサイズは元データの約4/3倍(約33%増)になります。3バイトのデータを4文字(6ビット×4)に変換する仕組みのためです。例えば3MBの画像をBase64エンコードすると約4MBになります。HTMLにデータURIとして埋め込む場合、ページサイズが増える点に注意が必要です。

Base64とBase64URLの違いは何ですか?

Base64URLは、URLやファイル名に安全に使えるようBase64を変形したものです。違いは3点あります。①「+」を「-」に変換、②「/」を「_」に変換、③末尾の「=」パディングを省略できる。JWTのヘッダー・ペイロード・署名部分はBase64URL形式が使われています。通常のBase64の「+」と「/」はURLエンコードが必要になるため、URL中では利用に注意が必要です。

JWTのペイロードをBase64でデコードすると何が見えますか?

JWTは「ヘッダー.ペイロード.署名」の形式で、ヘッダーとペイロードはBase64URLエンコードされた平文のJSONです。ペイロードをデコードすると、ユーザーID・メールアドレス・有効期限(exp)・発行者(iss)などの情報が見えます。JWTは署名により改ざんを検知できますが、内容自体は誰でも読めるため、パスワードや機密情報をペイロードに含めてはいけません。

データURIとは何ですか?画像をBase64で埋め込む方法は?

データURIはファイルの内容をURLの形式でインラインに埋め込む仕組みです。形式は「data:MIMEタイプ;base64,エンコード済みデータ」です。例えばCSSで背景画像を外部ファイルなしに埋め込む場合、「background: url("data:image/png;base64,iVBORw...")」と記述します。HTMLのimgタグのsrc属性にも使えます。ただしBase64の33%増というサイズ増加があるため、大きな画像への利用はページ読み込み速度の観点から推奨されません。

JavaScriptでBase64のエンコード・デコードをするにはどうすればよいですか?

ブラウザ・Node.jsともに組み込み関数が使えます。エンコードは「btoa(文字列)」、デコードは「atob(Base64文字列)」です。ただしbtoaは日本語などのマルチバイト文字を直接扱えないため、TextEncoderとの組み合わせが必要です。例えば「btoa(String.fromCharCode(...new TextEncoder().encode(str)))」のように変換します。ぱんだツールズのBase64エンコード/デコードツールを使えばブラウザ上で手軽に試せます。

ファイルはサーバーに送信されますか?

ファイルはサーバーに送信されません。Base64エンコード/デコードの処理はすべてブラウザ内(JavaScript)で完結します。機密情報を含むファイルや文字列でも安心してお使いいただけます。

この記事で紹介したツール