Pythonでbase64を扱う方法を解説

Python

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だけでなくBase32Base16Base85もサポートしています。

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モジュールを使えば、バイナリデータを扱う場面で簡単にエンコード・デコードが可能になります。

タイトルとURLをコピーしました