Pythonでbase64を扱う方法を解説します。具体的にはPythonの標準モジュールであるbase64の使い方を説明します。
base64とは
Base64 は、バイナリデータを ASCII 文字列に変換するエンコーディング方式で、主に次の用途で使用されます。
- バイナリデータのテキスト変換: 画像、PDF、音声データなどのバイナリファイルをテキスト形式に変換し、メールやJSONなどで送信できるようにする。
- URLやファイル名のエンコーディング: URLに含める際に問題が起こらないようにデータを変換する。
- Basic認証などの認証情報のエンコーディング: HTTPのBasic認証でユーザー名とパスワードをBase64でエンコードして送信する。
base64 モジュール
base64モジュールは簡単にbase64形式にエンコード・デコードする機能を提供します。
base64エンコード
b64encode() は入力のバイト列をbase64でエンコードしたバイト列を返り値として返します。
import base64
data = "Hello, World!"
encoded_data = base64.b64encode(data.encode("utf-8"))
print(encoded_data) # b'SGVsbG8sIFdvcmxkIQ=='
- b64encode()はバイト列をBase64に変換する。
- 入力はバイト列 (encode(“utf-8”)で変換) にする必要がある。
- 出力は バイト列 (b’SGVsbG8sIFdvcmxkIQ==’) となる。
base64デコード
b64decode()は入力のbase64のバイト列をデコードしたバイト列を返り値として返します。
import base64
data = "Hello, World!"
decoded_data = base64.b64decode(encoded_data).decode("utf-8")
print(decoded_data) # "Hello, World!"
- b64decode()でデコードするとバイト列になるので、decode(“utf-8”)で文字列に変換する。
バイナリデータ(画像など)のエンコード・デコード
with open("image.png", "rb") as image_file:
encoded_image = base64.b64encode(image_file.read())
# Base64エンコードされたデータを復元
with open("decoded_image.png", "wb") as output_file:
output_file.write(base64.b64decode(encoded_image))
- 画像をBase64エンコードして文字列として扱う。
b64decode()
を使って元のバイナリデータに戻す。
URLセーフなBase64エンコード
base64.urlsafe_b64encode()を使うと、URLで問題になりやすい「+」「/」をそれぞれ「-」「_」に置き換えたエンコードが可能です。
import base64
data = "Hello, World!"
url_safe_encoded = base64.urlsafe_b64encode(data.encode("utf-8"))
print(url_safe_encoded) # b'SGVsbG8sIFdvcmxkIQ=='
decoded_url_safe = base64.urlsafe_b64decode(url_safe_encoded).decode("utf-8")
print(decoded_url_safe) # "Hello, World!"
Base32, Base16, Base85エンコーディング
base64 モジュールはBase64だけでなくBase32、Base16、Base85もサポートしています。
base32_encoded = base64.b32encode(data.encode("utf-8"))
print(base32_encoded) # b'JBSWY3DPEBLW64TMMQ======'
base16_encoded = base64.b16encode(data.encode("utf-8"))
print(base16_encoded) # b'48656C6C6F2C20576F726C6421'
base85_encoded = base64.b85encode(data.encode("utf-8"))
print(base85_encoded) # b'NM&qnZy:0nv6p'
- Base32: 大文字の英数字のみを使用するため、可読性が高いが長くなる。
- Base16 (Hex): 16進エンコードで、人間が理解しやすい。
- Base85: よりコンパクトな表現が可能(Ascii85形式)。
注意点
1. Base64 は暗号化ではない
Base64は単なるエンコーディング(データ変換)であり、セキュリティ目的の暗号化ではありません。例えば、パスワードをBase64でエンコードして保存するのは絶対に避けるべきです。
❌ 間違った使い方
import base64
password = "SuperSecretPassword123"
encoded_password = base64.b64encode(password.encode()).decode()
print(encoded_password) # "U3VwZXJTZWNyZXRQYXNzd29yZDEyMw=="
誰でもb64decode()を使って簡単に復元できてしまいます。
✅ 正しい方法(ハッシュ化)
import hashlib
hashed_password = hashlib.sha256(password.encode()).hexdigest()
print(hashed_password) # ハッシュ化された値
ハッシュ化を行うことで、元のパスワードを直接取得することができなくなり、安全性が向上します。
2. Base64 はデータサイズが増加する
Base64は3バイトのデータを4バイトに変換 するため、サイズが約33%増加 します。
import base64
data = b"Hello, World!"
encoded_data = base64.b64encode(data)
print(len(data)) # 13 バイト
print(len(encoded_data)) # 18 バイト (33% 増加)
大きなファイルをエンコードするとデータサイズが増えるため、通信やストレージに影響することがあります。
3. バイナリデータは適切に処理する
Base64のエンコード・デコードではバイナリデータ (bytes)を扱う必要がある ため文字列 (str)ではなくバイト(bytes)を使用 する必要があります。
❌ 間違った使い方
import base64
data = "Hello, World!"
encoded_data = base64.b64encode(data) # エラー発生! (bytes でない)
✅ 正しい使い方
import base64
data = "Hello, World!".encode("utf-8") # str → bytes
encoded_data = base64.b64encode(data)
print(encoded_data) # b'SGVsbG8sIFdvcmxkIQ=='
decoded_data = base64.b64decode(encoded_data).decode("utf-8") # bytes → str
print(decoded_data) # "Hello, World!"
エンコード前にencode(“utf-8”)を使用し、デコード後にdecode(“utf-8”)を適用することで、バイナリデータと文字列の変換を適切に行うことができます。
4. Base64 のパディング (=) の扱い
Base64 のエンコード結果は4の倍数でない場合「=」で埋められます。これを削除するとデコード時にエラーになる可能性があります。
❌ 間違った使い方
import base64
data = "Hello"
encoded_data = base64.b64encode(data.encode()).decode()
trimmed_data = encoded_data.rstrip("=") # パディングを削除
# デコード時にエラー!
decoded_data = base64.b64decode(trimmed_data).decode()
✅ 正しい使い方
encoded_str = base64.b64encode(data.encode()).decode().rstrip("=")
# デコード時にパディングを復元
padding_needed = len(encoded_str) % 4
encoded_str += "=" * (4 - padding_needed) if padding_needed else ""
decoded_data = base64.b64decode(encoded_str).decode()
print(decoded_data) # "Hello"
パディングを削除するとデコード時にエラーが発生する可能性があるため、デコード時には適切に「=」を復元する処理を行う必要があります。
5. URLに使う場合はurlsafe_b64encode()を使用
通常のbase64.b64encode()は「+」や「/」を含むため、URLで使用すると問題が発生することがあります。
✅ URL に安全な方法
import base64
data = "user/data?id=123"
encoded_data = base64.urlsafe_b64encode(data.encode()).decode()
print(encoded_data) # "dXNlci9kYXRhP2lkPTEyMw=="
decoded_data = base64.urlsafe_b64decode(encoded_data).decode()
print(decoded_data) # "user/data?id=123"
urlsafe_b64encode()を使用することで、「+」や「/」を 「-」や「_」に変換し、URLに安全な形式に変換できます。
6. JSON に含めるときは .decode(“utf-8”) を忘れずに
Base64の結果はバイナリデータ (bytes)なので、そのまま JSON に含めるとエラーになります。
❌ 間違った使い方
import base64
import json
data = b"binary data"
encoded_data = base64.b64encode(data) # bytes のまま
json_data = json.dumps({"file": encoded_data}) # エラー!
✅ 正しい使い方
json_data = json.dumps({"file": encoded_data.decode("utf-8")}) # str に変換
print(json_data) # '{"file": "YmluYXJ5IGRhdGE="}'
Base64 のエンコード結果はbytes型のため、JSONに含める際にはdecode(“utf-8”)を使用して文字列に変換する必要があります。
まとめ
- base64.b64encode() / base64.b64decode()でエンコード・デコード。
- urlsafe_b64encode()を使うと URL に安全な形式にできる。
- Base32 / Base16 / Base85も利用可能。
- 画像やバイナリデータのエンコードにも使える。
Pythonのbase64モジュールを使えば、バイナリデータを扱う場面で簡単にエンコード・デコードが可能になります。