·7分で読めます

Base64とは?Encodingをわかりやすく解説

Base64はwebで最も広く使われるencoding方式のひとつです。URL、email、CSS fileなどで長い英数字のstringを見たことがあるなら、それはBase64かもしれません。仕組みと重要性を解説します。

Base64とは?

Base64は、binary dataを64個の印字可能なASCII charactersで表すbinary-to-text encoding方式です。画像、files、raw bytesを、text-based systemsで安全に運べるtext stringへ変換します。

名前はBase64が64 charactersを使うことに由来します。2^6 = 64なので、各characterは正確に6 bitsの情報を表します。

Base64はRFC 4648で定義されており、email、data URIs、APIs、JWT tokens、certificatesなど、多くのweb formatsで使われています。

なぜBase64が必要なのか?

多くのsystemsは、raw binary dataではなくtextだけを扱う前提で設計されていました。たとえば次のようなものです。

  • Email (SMTP) - もともと7-bit ASCII textを想定していたため、binary attachmentsにはencodingが必要です。
  • JSON - native binary typeがないため、bytesは通常stringsとして保存されます。
  • URLs - 安全に使えるcharacter setが限られています。
  • HTML/CSS - text formatsなので、埋め込みassetsにはtext表現が必要です。

Base64はbinary dataを安全なtext表現へ変換し、こうしたsystemsで壊れずに運べるようにします。

Base64 Encodingの仕組み

encoding processは次の4 stepsです。

  1. inputをbytesのstreamとして読みます。各byteは8 bitsです。
  2. bitsを6 bitsずつのchunksに分けます。
  3. 各6-bit groupをBase64 alphabetのcharacterにmapします。
  4. input lengthが3で割り切れない場合、=paddingします。

重要な考え方は、input 3 bytesがBase64 characters 4つになることです。そのためBase64はsizeを約33%増やします。

Base64 Alphabet

standard Base64 alphabetは64 charactersで構成されます。

RangeCharactersValues
UppercaseA-Z0-25
Lowercasea-z26-51
Digits0-952-61
Special+ and /62-63
Padding=alignmentに使用

さらにURL-safe variantもあり、+-に、/_に置き換えます。

Step-by-Step Encoding Example

string Hi! をBase64へencodeしてみましょう。

Step 1: Convert to ASCII values
  H = 72,  i = 105,  ! = 33

Step 2: Convert to binary (8 bits each)
  01001000  01101001  00100001

Step 3: Regroup into 6-bit chunks
  010010  000110  100100  100001

Step 4: Convert to decimal
  18  6  36  33

Step 5: Map to Base64 alphabet
  S   G   k   h

Result: "Hi!" -> "SGkh"

Hi!はちょうど3 bytesなので、paddingなしで4つのBase64 charactersにきれいにmapされます。

Padding (=) を理解する

Base64は3 bytesを4 charactersにするgroupで動作します。inputが3で割り切れない場合はpaddingを追加します。

Input bytesRemainderPaddingExample
3で割り切れる0なし"Hi!" -> "SGkh"
1 byte残る1=="H" -> "SA=="
2 bytes残る2="Hi" -> "SGk="

= paddingにより、encoded outputは4 charactersの倍数になり、decodingが予測しやすくなります。

Base64の一般的な用途

Base64はmodern software developmentのあちこちで使われています。

  • Data URIs - 小さな画像をHTMLやCSSへ直接埋め込みます。
  • Email attachments (MIME) - binary filesをemailに添付する前にencodeします。
  • JWT tokens - headerとpayloadにBase64URL encodingを使います。
  • API authentication - HTTP Basic authはcredentialsをBase64 textとして送信します。
  • JSON/XML内のbinary保存 - certificates、keys、binary blobsをtextとして表現できます。
  • Source maps - JavaScript source mapsはBase64-style VLQ mappingsを使います。

CodeでのBase64

多くのlanguagesにはBase64 supportが組み込まれています。いくつか例を見てみましょう。

JavaScript

// Encode
const encoded = btoa("Hello, World!");
console.log(encoded); // "SGVsbG8sIFdvcmxkIQ=="

// Decode
const decoded = atob("SGVsbG8sIFdvcmxkIQ==");
console.log(decoded); // "Hello, World!"

Python

import base64

# Encode
encoded = base64.b64encode(b"Hello, World!")
print(encoded)  # b'SGVsbG8sIFdvcmxkIQ=='

# Decode
decoded = base64.b64decode(encoded)
print(decoded)  # b'Hello, World!'

Command Line

# Encode (Linux/macOS)
echo -n "Hello, World!" | base64
# SGVsbG8sIFdvcmxkIQ==

# Decode
echo "SGVsbG8sIFdvcmxkIQ==" | base64 --decode
# Hello, World!

よくある誤解

Base64について、よく誤解される点があります。

"Base64はencryption"

Base64はencryptionではありません。誰でもすぐdecodeできるため、sensitive dataを隠す目的で使ってはいけません。

"Base64はdataをcompressする"

Base64は実際にはdata sizeを約33%増やします。これはencodingであり、compressionではありません。

"Base64はimages専用"

image data URIsは一般的ですが、Base64はfiles、certificates、tokensなど、あらゆるbinary dataを表現できます。

Base64を使うべきでない場面

Base64は便利ですが、常に正しい選択とは限りません。

  • Large files - 33%のsize increaseはすぐ大きな負担になります。
  • Security - sensitive dataにはBase64ではなく本物のencryptionを使いましょう。
  • Performance-critical paths - encodingとdecodingにはCPU costがあります。
  • Web pages内のlarge images - separate image filesの方が、browserが個別にcacheできるため通常は適しています。

目安としては、text-only channelを通してbinary dataを送る必要がある場合にBase64を使います。binary transportが使えるなら、そちらを優先しましょう。

Base64をすぐにEncode & Decode

無料のBase64 Encoder/Decoder toolで、textをBase64へencodeしたり、Base64 stringsをbrowser内ですぐdecodeできます。

Base64 Encoder/Decoderを試す

参考資料

  1. Josefsson, S. (2006). The Base16, Base32, and Base64 Data Encodings. RFC 4648, IETF. https://datatracker.ietf.org/doc/html/rfc4648
  2. Freed, N. & Borenstein, N. (1996). Multipurpose Internet Mail Extensions (MIME) Part One: Format of Internet Message Bodies. RFC 2045, IETF. https://datatracker.ietf.org/doc/html/rfc2045
  3. Mozilla Developer Network. btoa() global function. https://developer.mozilla.org/en-US/docs/Web/API/btoa
  4. Mozilla Developer Network. Data URLs. https://developer.mozilla.org/en-US/docs/Web/HTTP/Basics_of_HTTP/Data_URLs
  5. Python Software Foundation. base64 - Base16, Base32, Base64, Base85 Data Encodings. https://docs.python.org/3/library/base64.html