Giải Mã Base64 Python — b64decode() Guide

·Backend Developer·Đánh giá bởiDmitri Volkov·Đã xuất bản

Sử dụng Giải mã Base64 Trực tuyến miễn phí trực tiếp trên trình duyệt — không cần cài đặt.

Dùng thử Giải mã Base64 Trực tuyến trực tuyến →

Khi một API trả về trường content trông như eyJob3N0IjogImRiLXByb2Qi…, hoặc trình quản lý bí mật của bạn cung cấp một thông tin xác thực đã mã hóa, hoặc bạn cần trích xuất payload JWT—— giải mã base64 trong Python là điểm đến đầu tiên của bạn. Module base64 tích hợp sẵn xử lý tất cả, nhưng những chi tiết nhỏ xung quanh bytes vs chuỗi, bảng chữ cái an toàn cho URL, và padding bị thiếu đã từng làm khó gần như mọi lập trình viên ít nhất một lần—— tôi đã debug loại lỗi này trong các buổi code review nhiều hơn mức tôi muốn thừa nhận. Hướng dẫn này bao gồm base64.b64decode(), urlsafe_b64decode(), tự động sửa padding, giải mã từ tệp và phản hồi HTTP, công cụ CLI, xác thực đầu vào, và bốn lỗi phổ biến với cách sửa trước/sau——tất cả là ví dụ Python 3.8+ có thể chạy được. Nếu bạn chỉ cần giải mã nhanh một lần mà không cần viết code, Công cụ giải mã Base64 của ToolDeck xử lý cả Base64 tiêu chuẩn và an toàn cho URL ngay lập tức trên trình duyệt của bạn.

  • base64.b64decode(s) được tích hợp sẵn trong stdlib của Python — không cần cài đặt; luôn trả về bytes, không phải str.
  • Nối .decode("utf-8") sau b64decode() để chuyển đổi bytes thành chuỗi Python — hàm này không biết encoding văn bản gốc.
  • Với Base64 an toàn cho URL (dùng - và _ thay cho + và /), hãy dùng base64.urlsafe_b64decode() — tiêu chuẩn trong JWT, token OAuth và thông tin xác thực Google API.
  • Sửa lỗi "Incorrect padding" phổ biến bằng: padded = s + "=" * (-len(s) % 4) — thêm 0, 1 hoặc 2 ký tự tùy theo nhu cầu.
  • Đặt validate=True cho mọi đầu vào từ nguồn bên ngoài để phát sinh binascii.Error với các ký tự không phải Base64 thay vì bỏ qua chúng.

Giải mã Base64 là gì?

Base64 là một sơ đồ mã hóa biểu diễn dữ liệu nhị phân tùy ý dưới dạng chuỗi gồm 64 ký tự ASCII có thể in được: A–Z, a–z, 0–9, +, và /, với = được dùng làm padding. Mỗi 4 ký tự Base64 mã hóa chính xác 3 byte gốc, vì vậy dạng mã hóa lớn hơn nguồn khoảng 33%. Giải mã đảo ngược quá trình — chuyển đổi biểu diễn ASCII trở lại thành byte gốc.

Base64 không mã hóa dữ liệu. Đây thuần túy là mã hóa nhị phân sang văn bản — chuỗi đã mã hóa có thể được đọc hoàn toàn bởi bất kỳ ai chạy nó qua bộ giải mã:

Trước — đã mã hóa Base64

eyJob3N0IjogImRiLXByb2QubXljb21wYW55LmludGVybmFsIiwgInBvcnQiOiA1NDMyLCAidXNlciI6ICJhcHBfc3ZjIn0=

Sau — đã giải mã

{"host": "db-prod.mycompany.internal", "port": 5432, "user": "app_svc"}

base64.b64decode() — Giải mã bằng Thư viện Chuẩn

Module base64 của Python đi kèm với thư viện chuẩn——không cần cài đặt, luôn sẵn có. Hàm chính là base64.b64decode(s, altchars=None, validate=False). Nó chấp nhận str, bytes, hoặc bytearray, và luôn trả về bytes.

Ví dụ tối giản hoạt động được

Python 3.8+
import base64
import json

# Encoded database config received from a secrets manager
encoded_config = (
    "eyJob3N0IjogImRiLXByb2QubXljb21wYW55LmludGVybmFsIiwgInBvcnQiOiA1NDMyLCAid"
    "XNlciI6ICJhcHBfc3ZjIiwgInBhc3N3b3JkIjogInM0ZmVQYXNzITIwMjYifQ=="
)

# Step 1: decode Base64 bytes
raw_bytes = base64.b64decode(encoded_config)
print(raw_bytes)
# b'{"host": "db-prod.mycompany.internal", "port": 5432, "user": "app_svc", "password": "s4fePass!2026"}'

# Step 2: convert bytes → str
config_str = raw_bytes.decode("utf-8")

# Step 3: parse into a dict
config = json.loads(config_str)
print(config["host"])    # db-prod.mycompany.internal
print(config["port"])    # 5432
Lưu ý:b64decode() luôn trả về bytes — không bao giờ là chuỗi. Nếu dữ liệu gốc là văn bản, hãy nối thêm .decode("utf-8"). Nếu là dữ liệu nhị phân (hình ảnh, PDF, kho lưu trữ gzip), giữ bytes nguyên vẹn và ghi vào tệp hoặc truyền trực tiếp đến thư viện sử dụng.

Ví dụ mở rộng: sort_keys, ensure_ascii, và xác thực nghiêm ngặt

Python 3.8+
import base64
import binascii

# Token from an internal event bus — validate strictly (external input)
encoded_event = (
    "eyJldmVudCI6ICJvcmRlci5zaGlwcGVkIiwgIm9yZGVyX2lkIjogIk9SRC04ODQ3MiIsICJ"
    "0aW1lc3RhbXAiOiAiMjAyNi0wMy0xM1QxNDozMDowMFoiLCAicmVnaW9uIjogImV1LXdlc3QtMSJ9"
)

try:
    # validate=True raises binascii.Error on any non-Base64 character
    raw = base64.b64decode(encoded_event, validate=True)
    event = raw.decode("utf-8")
    print(event)
    # {"event": "order.shipped", "order_id": "ORD-88472", "timestamp": "2026-03-13T14:30:00Z", "region": "eu-west-1"}

except binascii.Error as exc:
    print(f"Invalid Base64: {exc}")
except UnicodeDecodeError as exc:
    print(f"Not UTF-8 text: {exc}")

Giải mã Base64 An toàn cho URL (base64url)

Base64 tiêu chuẩn sử dụng +/, là các ký tự dành riêng trong URL. Biến thể an toàn cho URL (RFC 4648 §5, còn gọi là “base64url”) thay thế chúng bằng -_. Đây là mã hóa được sử dụng trong token JWT, thử thách OAuth 2.0 PKCE, thông tin xác thực Google Cloud, và hầu hết các luồng xác thực web hiện đại.

Truyền Base64 an toàn cho URL vào b64decode() mà không điều chỉnh bảng chữ cái sẽ làm hỏng dữ liệu một cách im lặng hoặc phát sinh binascii.Error. Thay vào đó hãy dùng base64.urlsafe_b64decode() — nó tự động xử lý việc thay thế-+_/.

Python 3.8+
import base64
import json

# JWT payload segment (the middle part between the two dots)
# JWTs use URL-safe Base64 without trailing "=" padding
jwt_payload_b64 = (
    "eyJ1c2VyX2lkIjogMjg5MywgInJvbGUiOiAiYWRtaW4iLCAiaXNzIjogImF1dGgubXljb21w"
    "YW55LmNvbSIsICJleHAiOiAxNzQwOTAwMDAwLCAianRpIjogImFiYzEyMzQ1LXh5ei05ODc2In0"
)

# Restore padding before decoding (JWT deliberately omits '=')
padded = jwt_payload_b64 + "=" * (-len(jwt_payload_b64) % 4)

payload_bytes = base64.urlsafe_b64decode(padded)
payload = json.loads(payload_bytes.decode("utf-8"))

print(payload["role"])    # admin
print(payload["iss"])     # auth.mycompany.com
print(payload["user_id"]) # 2893
Lưu ý:Biểu thức "=" * (-len(s) % 4) thêm đúng 0, 1, hoặc 2 ký tự padding tùy theo nhu cầu và là no-op khi chuỗi đã được padding đúng cách. Đây là cách sửa lỗi padding JWT và OAuth theo cách thành ngữ Python.

Tài liệu tham khảo tham số base64.b64decode()

Tất cả các tham số bên dưới áp dụng cho cả b64decode()urlsafe_b64decode(), ngoại trừ altchars chỉ có sẵn trong b64decode().

Tham sốKiểuMặc địnhMô tả
sbytes | str | bytearrayĐầu vào đã mã hóa Base64 cần giải mã; ASCII str được chấp nhận cùng với kiểu bytes.
altcharsbytes | NoneNoneChuỗi 2 byte thay thế +/; cho phép bảng chữ cái Base64 tùy chỉnh ngoài biến thể an toàn URL tiêu chuẩn.
validateboolFalseKhi True, phát sinh binascii.Error với bất kỳ ký tự nào ngoài bảng chữ cái Base64; khi False, byte không thuộc bảng chữ cái (xuống dòng, khoảng trắng) bị bỏ qua im lặng.

Mặc định validate=False là có chủ ý cho dữ liệu định dạng PEM và Base64 nhiều dòng (nơi xuống dòng là phổ biến). Đối với payload API, tải lên của người dùng, hoặc bất kỳ đầu vào không tin cậy nào, hãy truyền validate=True để phát hiện sớm dữ liệu bị hỏng hoặc bị chèn và hiển thị lỗi rõ ràng.

Lỗi Padding Khi Giải mã Base64 trong Python — Cách Sửa

Lỗi phổ biến nhất khi giải mã Base64 trong Python là:

Python 3.8+
import base64

base64.b64decode("eyJ0eXBlIjogImFjY2VzcyJ9")
# binascii.Error: Incorrect padding

Base64 yêu cầu độ dài chuỗi là bội số của 4. Khi dữ liệu đi qua URL, header HTTP, hoặc thư viện JWT, padding = ở cuối bị xóa để tiết kiệm byte. Có hai cách đáng tin cậy để sửa điều này.

Tùy chọn 1: Khôi phục padding ngay trong code (khuyến nghị)

Python 3.8+
import base64
import json

def b64decode_unpadded(data: str | bytes) -> bytes:
    """Decode Base64 with automatic padding correction."""
    if isinstance(data, str):
        data = data.encode("ascii")
    data += b"=" * (-len(data) % 4)
    return base64.b64decode(data)

# Works regardless of how many '=' were stripped
token_a = "eyJ0eXBlIjogImFjY2VzcyJ9"       # 0 chars of padding stripped
token_b = "eyJ0eXBlIjogInJlZnJlc2gifQ"      # 1 char stripped
token_c = "eyJ0eXBlIjogImFwaV9rZXkifQ=="    # already padded

for token in (token_a, token_b, token_c):
    result = json.loads(b64decode_unpadded(token).decode("utf-8"))
    print(result["type"])
# access
# refresh
# api_key

Tùy chọn 2: Giải mã an toàn URL với padding cho OAuth / JWT

Python 3.8+
import base64
import json

def decode_jwt_segment(segment: str) -> dict:
    """Decode a single JWT segment (header or payload)."""
    # Add padding, use URL-safe alphabet
    padded = segment + "=" * (-len(segment) % 4)
    raw = base64.urlsafe_b64decode(padded)
    return json.loads(raw.decode("utf-8"))

# Google OAuth ID token payload (simplified)
id_token_payload = (
    "eyJzdWIiOiAiMTEwNTY5NDkxMjM0NTY3ODkwMTIiLCAiZW1haWwiOiAic2FyYS5jaGVuQGV4"
    "YW1wbGUuY29tIiwgImhkIjogImV4YW1wbGUuY29tIiwgImlhdCI6IDE3NDA5MDAwMDB9"
)

claims = decode_jwt_segment(id_token_payload)
print(claims["email"])   # sara.chen@example.com
print(claims["hd"])      # example.com

Giải mã Base64 từ Tệp và Phản hồi API

Đọc Base64 từ đĩa và giải mã payload API là hai tình huống production phổ biến nhất. Cả hai đều cần xử lý lỗi đúng cách — padding bị hỏng và các kiểu nhị phân không mong đợi là những trường hợp thực tế, không phải edge case lý thuyết.

Đọc và giải mã tệp Base64

Python 3.8+
import base64
import json
from pathlib import Path

def decode_attachment(envelope_path: str, output_path: str) -> None:
    """
    Read a JSON envelope with a Base64-encoded attachment,
    decode it, and write the binary output to disk.
    """
    try:
        envelope = json.loads(Path(envelope_path).read_text(encoding="utf-8"))
        encoded_data = envelope["attachment"]["data"]
        file_bytes = base64.b64decode(encoded_data, validate=True)
        Path(output_path).write_bytes(file_bytes)
        print(f"Saved {len(file_bytes):,} bytes → {output_path}")
    except FileNotFoundError:
        print(f"Envelope file not found: {envelope_path}")
    except (KeyError, TypeError):
        print("Unexpected envelope structure — 'attachment.data' missing")
    except base64.binascii.Error as exc:
        print(f"Invalid Base64 content: {exc}")

# Example envelope:
# {"attachment": {"filename": "invoice_2026_03.pdf", "data": "JVBERi0xLjQK..."}}
decode_attachment("order_ORD-88472.json", "invoice_2026_03.pdf")

Giải mã Base64 từ phản hồi HTTP API

Python 3.8+
import base64
import json
import urllib.request

def fetch_and_decode_secret(vault_url: str, secret_name: str) -> str:
    """
    Retrieve a Base64-encoded secret from an internal vault API
    and return the decoded plaintext value.
    """
    url = f"{vault_url}/v1/secrets/{secret_name}"
    req = urllib.request.Request(url, headers={"X-Vault-Token": "s.internal"})

    try:
        with urllib.request.urlopen(req, timeout=5) as resp:
            body = json.loads(resp.read().decode("utf-8"))
            # Vault returns: {"data": {"value": "<base64>", "encoding": "base64"}}
            encoded = body["data"]["value"]
            return base64.b64decode(encoded).decode("utf-8")

    except urllib.error.URLError as exc:
        raise RuntimeError(f"Vault unreachable: {exc}") from exc
    except (KeyError, UnicodeDecodeError, base64.binascii.Error) as exc:
        raise ValueError(f"Unexpected secret format: {exc}") from exc

# db_pass = fetch_and_decode_secret("https://vault.internal", "db-prod-password")
# print(db_pass)  # s4feP@ss!2026
Lưu ý:Nếu bạn dùng thư viện requests, hãy thay urllib.request bằng resp = requests.get(url, timeout=5, headers=headers) body = resp.json(). Logic giải mã Base64 hoàn toàn giống nhau.

Giải mã Base64 qua Dòng lệnh

Để kiểm tra nhanh trên terminal — xác minh token, xem blob cấu hình đã mã hóa, hoặc dẫn output API qua bộ giải mã — lệnh base64 có sẵn trên Linux và macOS. Module -m base64 tích hợp của Python hoạt động đa nền tảng bao gồm cả Windows.

Bash
# Decode a Base64 string and print the result (Linux / macOS)
echo "eyJob3N0IjogImRiLXByb2QubXljb21wYW55LmludGVybmFsIn0=" | base64 --decode
# {"host": "db-prod.mycompany.internal"}

# Decode a file, save decoded output
base64 --decode encoded_payload.txt > decoded_output.json

# Python's cross-platform CLI decoder (works on Windows too)
python3 -m base64 -d encoded_payload.txt

# Decode a JWT payload segment inline — strip header/signature first
echo "eyJ1c2VyX2lkIjogMjg5MywgInJvbGUiOiAiYWRtaW4ifQ" | python3 -c "
import sys, base64, json
s = sys.stdin.read().strip()
padded = s + '=' * (-len(s) % 4)
print(json.dumps(json.loads(base64.urlsafe_b64decode(padded)), indent=2))
"

Với công việc khám phá mà viết pipeline shell cảm thấy quá phức tạp, dán chuỗi vào Công cụ giải mã Base64 trực tuyến — nó tự động phát hiện đầu vào an toàn URL và sửa padding ngay lập tức.

Xác thực Đầu vào Base64 Trước Khi Giải mã

Khi dữ liệu Base64 đến từ đầu vào người dùng, webhook, hoặc API bên thứ ba không tin cậy, hãy xác thực trước khi giải mã để hiển thị lỗi rõ ràng, có thể xử lý được thay vì các traceback binascii.Error gây nhầm lẫn sâu trong logic nghiệp vụ. Python cung cấp hai cách tiếp cận: bắt exception, hoặc xác thực trước bằng regex.

Python 3.8+
import base64
import binascii
import re

# ── Option A: try/except (recommended for most code paths) ──────────────────

def safe_b64decode(data: str) -> bytes | None:
    """Return decoded bytes, or None if the input is not valid Base64."""
    try:
        padded = data + "=" * (-len(data) % 4)
        return base64.b64decode(padded, validate=True)
    except (binascii.Error, ValueError):
        return None

print(safe_b64decode("not-base64!!"))                     # None
print(safe_b64decode("eyJ0eXBlIjogInJlZnJlc2gifQ"))      # b'{"type": "refresh"}'


# ── Option B: regex pre-validation ──────────────────────────────────────────

# Standard Base64 (alphabet: A-Z a-z 0-9 + /)
_STANDARD_RE = re.compile(r"^[A-Za-z0-9+/]*={0,2}$")

# URL-safe Base64 (alphabet: A-Z a-z 0-9 - _)
_URLSAFE_RE = re.compile(r"^[A-Za-z0-9-_]*={0,2}$")

def is_valid_base64(s: str) -> bool:
    """True if s is a syntactically valid standard Base64 string."""
    # Length must be a multiple of 4 for fully padded strings
    stripped = s.rstrip("=")
    padded = stripped + "=" * (-len(stripped) % 4)
    return bool(_STANDARD_RE.match(padded))

print(is_valid_base64("SGVsbG8gV29ybGQ="))   # True
print(is_valid_base64("SGVsbG8gV29ybGQ!"))   # False  (! is not Base64)

Giải pháp thay thế hiệu suất cao: pybase64

Đối với phần lớn trường hợp sử dụng, module base64 của stdlib Python hoàn toàn đủ. Nếu bạn xử lý hàng nghìn payload API mỗi giây, giải mã tệp đính kèm nhị phân nhiều megabyte trong vòng lặp chặt, hoặc profiler của bạn cho thấy các thao tác Base64 là điểm nóng — hãy xem xét pybase64. Đây là wrapper mở rộng C xung quanh libbase64 và thường nhanh hơn 2–5× so với triển khai stdlib trên đầu vào lớn.

Bash
pip install pybase64
Python 3.8+
import pybase64

# Drop-in replacement — identical API to the stdlib base64 module
encoded_image = "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAC0lEQVQI12NgAAIABQ..."

image_bytes = pybase64.b64decode(encoded_image, validate=False)
print(f"Decoded {len(image_bytes):,} bytes")

# URL-safe variant — same as base64.urlsafe_b64decode()
token_bytes = pybase64.urlsafe_b64decode("eyJpZCI6IDQ3MX0=")
print(token_bytes)  # b'{"id": 471}'

# Benchmark note: on strings under ~10 KB the function-call overhead dominates
# and the speedup is negligible. Profile before switching.

API được thiết kế giống hệt base64 — chỉ cần thay đổi import và không có gì khác thay đổi. Chỉ sử dụng khi profiling xác nhận rằng Base64 thực sự là điểm nghẽn, điều này hiếm gặp ngoài các pipeline dữ liệu thông lượng cao.

Lỗi Phổ biến

Tôi đã thấy bốn lỗi này trong code review nhiều lần — chúng đặc biệt phổ biến với các lập trình viên đến từ các ngôn ngữ như JavaScript hoặc PHP nơi giải mã Base64 trả về chuỗi trực tiếp, hoặc từ các hướng dẫn bỏ qua hoàn toàn việc xử lý lỗi.

Lỗi 1: Quên gọi .decode() trên kết quả

Before · Python
After · Python
# ❌ b64decode() returns bytes — this crashes downstream
import base64

raw = base64.b64decode("eyJ1c2VyX2lkIjogNDcxLCAicm9sZSI6ICJhZG1pbiJ9")

# TypeError: byte indices must be integers or slices, not str
user_id = raw["user_id"]
# ✅ decode bytes → str, then parse
import base64, json

raw = base64.b64decode("eyJ1c2VyX2lkIjogNDcxLCAicm9sZSI6ICJhZG1pbiJ9")
payload = json.loads(raw.decode("utf-8"))
print(payload["user_id"])  # 471
print(payload["role"])     # admin

Lỗi 2: Dùng b64decode() với đầu vào Base64 an toàn URL

Before · Python
After · Python
# ❌ JWT and OAuth tokens use '-' and '_' — not in standard alphabet
import base64

jwt_segment = "eyJ1c2VyX2lkIjogMjg5M30"
# binascii.Error or silently wrong bytes — unpredictable behaviour
base64.b64decode(jwt_segment)
# ✅ use urlsafe_b64decode() for any token with '-' or '_'
import base64, json

jwt_segment = "eyJ1c2VyX2lkIjogMjg5M30"
padded = jwt_segment + "=" * (-len(jwt_segment) % 4)
data = base64.urlsafe_b64decode(padded)
print(json.loads(data.decode("utf-8")))
# {'user_id': 2893}

Lỗi 3: Không sửa padding trên token đã bị cắt

Before · Python
After · Python
# ❌ JWTs and most URL-transmitted tokens strip '=' — this crashes
import base64

# Valid JWT payload segment — no padding, as per spec
segment = "eyJ0eXBlIjogImFjY2VzcyIsICJqdGkiOiAiMzgxIn0"
base64.urlsafe_b64decode(segment)
# binascii.Error: Incorrect padding
# ✅ add padding before every urlsafe_b64decode() call
import base64, json

segment = "eyJ0eXBlIjogImFjY2VzcyIsICJqdGkiOiAiMzgxIn0"
padded = segment + "=" * (-len(segment) % 4)
result = json.loads(base64.urlsafe_b64decode(padded).decode("utf-8"))
print(result["type"])  # access
print(result["jti"])   # 381

Lỗi 4: Gọi .decode("utf-8") trên dữ liệu nhị phân

Before · Python
After · Python
# ❌ Binary files (PDF, PNG, ZIP) are not UTF-8 text — this crashes
import base64

# Base64-encoded PDF starts with JVBERi... (%PDF-)
pdf_b64 = "JVBERi0xLjQKJeLjz9MKNyAwIG9iago8PC9U..."
pdf_text = base64.b64decode(pdf_b64).decode("utf-8")
# UnicodeDecodeError: 'utf-8' codec can't decode byte 0xe2
# ✅ write binary directly to a file — no .decode() needed
import base64
from pathlib import Path

pdf_b64 = "JVBERi0xLjQKJeLjz9MKNyAwIG9iago8PC9U..."
pdf_bytes = base64.b64decode(pdf_b64)
Path("report_q1_2026.pdf").write_bytes(pdf_bytes)
print(f"Saved {len(pdf_bytes):,} bytes")

Giải mã Tệp Base64 Lớn trong Python

Tải tệp Base64 200 MB bằng Path.read_text() và giải mã trong một lần gọi sẽ phân bổ chuỗi đã mã hóa, bytes đã giải mã, và mọi biểu diễn trung gian cùng lúc—— dễ dàng làm cạn kiệt bộ nhớ trên server bị hạn chế hoặc Lambda function. Với tệp lớn hơn ~50–100 MB, hãy dùng cách tiếp cận theo chunk.

Giải mã theo chunk ra đĩa (không tải toàn bộ tệp vào RAM)

Python 3.8+
import base64

def decode_large_b64_file(input_path: str, output_path: str, chunk_size: int = 65536) -> None:
    """
    Decode a large Base64 file in chunks to avoid loading the entire encoded
    string into memory. chunk_size must be a multiple of 4 to keep Base64
    block boundaries aligned across reads.
    """
    assert chunk_size % 4 == 0, "chunk_size must be a multiple of 4"

    bytes_written = 0
    with open(input_path, "rb") as src, open(output_path, "wb") as dst:
        while True:
            chunk = src.read(chunk_size)
            if not chunk:
                break
            # Strip whitespace that may appear in wrapped/multiline Base64
            chunk = chunk.strip()
            if chunk:
                dst.write(base64.b64decode(chunk))
                bytes_written += len(chunk)

    print(f"Decoded {bytes_written:,} Base64 bytes → {output_path}")

# Example: decode a 300 MB database snapshot stored as Base64
decode_large_b64_file("snapshot_2026_03_13.b64", "snapshot_2026_03_13.sql.gz")

Giải mã Base64 với base64.decodebytes() cho dữ liệu PEM / nhiều dòng

Python 3.8+
import base64

# base64.decodebytes() is designed for MIME / PEM Base64 that wraps at 76 chars.
# It silently ignores whitespace and newlines — perfect for certificate files.

with open("server_cert.pem", "rb") as f:
    pem_data = f.read()

# Strip PEM headers if present, then decode
lines = [
    line for line in pem_data.splitlines()
    if not line.startswith(b"-----")
]
raw_cert = base64.decodebytes(b"
".join(lines))
print(f"Certificate DER payload: {len(raw_cert):,} bytes")
Lưu ý:Dùng base64.decodebytes() cho chứng chỉ PEM, tệp đính kèm MIME, và Base64 nào xuống dòng ở độ rộng cố định. Dùng cách tiếp cận theo chunk ở trên cho các blob mờ lớn (bản sao lưu, tệp media). Với token một dòng gọn nhẹ (JWT, OAuth), b64decode() hoặc urlsafe_b64decode() luôn là lựa chọn đúng.

Các phương thức giải mã Base64 Python — So sánh nhanh

Phương thứcBảng chữ cáiPaddingĐầu raCần cài đặtTốt nhất cho
base64.b64decode()Tiêu chuẩn (A–Z a–z 0–9 +/)Bắt buộcbytesKhông (stdlib)Đa năng, email, PEM
base64.decodebytes()Tiêu chuẩn (A–Z a–z 0–9 +/)Bỏ qua (xóa khoảng trắng)bytesKhông (stdlib)Chứng chỉ PEM, tệp đính kèm MIME, Base64 nhiều dòng
base64.urlsafe_b64decode()An toàn URL (A–Z a–z 0–9 -_)Bắt buộcbytesKhông (stdlib)JWT, OAuth, Google Cloud API
base64.b32decode()32 ký tự (A–Z, 2–7)Bắt buộcbytesKhông (stdlib)Bí mật TOTP, ID an toàn DNS
base64.b16decode()Hex (0–9, A–F)Không cóbytesKhông (stdlib)Checksum mã hóa hex, hash
pybase64.b64decode()Tiêu chuẩn (A–Z a–z 0–9 +/)Bắt buộcbytesCó (pip)Pipeline thông lượng cao, payload lớn
CLI: base64 --decodeTiêu chuẩnTự độngstdoutKhông (hệ thống)Kiểm tra nhanh trên terminal

Dùng b64decode() làm mặc định. Chuyển sang urlsafe_b64decode()ngay khi bạn thấy - hoặc _ trong đầu vào — những ký tự đó là dấu hiệu rõ ràng của Base64 an toàn URL. Dùng pybase64 chỉ sau khi profiling xác nhận điểm nghẽn. Để kiểm tra một lần trong quá trình phát triển, Công cụ giải mã Base64 của ToolDeck xử lý cả hai bảng chữ cái và tự sửa padding — không cần môi trường Python.

Câu hỏi Thường gặp

Làm thế nào để giải mã chuỗi Base64 thành chuỗi thông thường trong Python?

Gọi base64.b64decode(encoded) để nhận bytes, sau đó gọi .decode("utf-8")trên kết quả để nhận str Python. Hai bước luôn riêng biệt vì b64decode() chỉ đảo ngược bảng chữ cái Base64 — nó không biết liệu nội dung gốc là UTF-8, Latin-1, hay nhị phân. Nếu dữ liệu dùng encoding không phải UTF-8, hãy truyền tên codec đúng cho .decode(), ví dụ .decode("latin-1").

Tại sao tôi nhận được "Incorrect padding" khi giải mã Base64 trong Python?

Chuỗi Base64 phải có độ dài là bội số của 4 ký tự. JWT, token OAuth, và dữ liệu truyền trong URL thường cắt bỏ padding = ở cuối. Sửa bằng cách nối thêm "=" * (-len(s) % 4) trước khi giải mã. Công thức này thêm đúng 0, 1, hoặc 2 ký tự tùy theo nhu cầu, và là no-op an toàn khi chuỗi đã được padding đúng cách.

Sự khác biệt giữa b64decode() và urlsafe_b64decode() trong Python là gì?

Cả hai đều giải mã cùng thuật toán Base64 nhưng với bảng chữ cái khác nhau cho ký tự thứ 62 và 63.b64decode() dùng +/; urlsafe_b64decode() dùng -_. Biến thể an toàn URL được định nghĩa trong RFC 4648 §5 và được dùng khi Base64 phải tồn tại trong URL, header HTTP, hoặc giá trị cookie mà không cần percent-encoding. Nhầm lẫn giữa chúng gây ra binascii.Error hoặc đầu ra bị hỏng im lặng.

Làm thế nào để giải mã ảnh được mã hóa Base64 trong Python?

Giải mã thành bytes bằng base64.b64decode(encoded), rồi ghi các bytes đó trực tiếp vào tệp — không gọi .decode("utf-8") trên dữ liệu ảnh. Nếu đầu vào là data URL (ví dụ data:image/png;base64,iVBORw0KGgo…), hãy bỏ tiền tố trước:

Python 3.8+
import base64
from pathlib import Path

# Data URL from an <img src="..."> or an API response
data_url = (
    "data:image/png;base64,"
    "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAC0lEQVQI12NgAAIABQ=="
)

# Split off the "data:image/png;base64," prefix
_, encoded = data_url.split(",", 1)
image_bytes = base64.b64decode(encoded)
Path("avatar_jsmith.png").write_bytes(image_bytes)
print(f"Saved {len(image_bytes)} bytes")

Tôi có thể giải mã Base64 trong Python mà không import module nào không?

Về mặt kỹ thuật là có, nhưng không có lý do gì để làm vậy. Module base64 là một phần của thư viện chuẩn Python, luôn sẵn có, luôn được cài đặt——nó không có dependency và các hàm của nó được triển khai bằng C. Tự triển khai lại Base64 từ đầu sẽ chậm hơn, dễ lỗi hơn, và khó bảo trì hơn. Luôn dùng import base64.

Làm thế nào để giải mã Base64 trong Python khi đầu vào là bytes, không phải chuỗi?

base64.b64decode() chấp nhận str, bytes, và bytearray có thể thay thế nhau——không cần chuyển đổi. Nếu bạn nhận được b"SGVsbG8=" từ socket hoặc đọc tệp, hãy truyền trực tiếp. Sửa padding hoạt động theo cùng cách với bytes: data + b"=" * (-len(data) % 4) khi làm việc ở chế độ bytes.

Công cụ Liên quan

  • Mã hóa Base64 — mã hóa văn bản hoặc tệp nhị phân sang Base64 ngay lập tức; hữu ích để tạo dữ liệu kiểm thử cho code giải mã Python của bạn mà không cần chạy script.
  • Giải mã JWT — kiểm tra header và payload JWT mà không cần viết code; payload được giải mã bằng Base64 an toàn URL bên dưới, đúng như các ví dụ trên.
  • Giải mã URL — percent-decode query string và phân đoạn đường dẫn; thường cần kết hợp với giải mã Base64 khi phân tích URL callback OAuth hoặc payload webhook.
  • Mã hóa URL — percent-encode các ký tự đặc biệt; hữu ích khi bạn cần nhúng giá trị đã mã hóa Base64 một cách an toàn vào tham số query URL.
Cũng có sẵn trong:JavaScriptGoJavaC#
MS
Maria SantosBackend Developer

Maria is a backend developer specialising in Python and API integration. She has broad experience with data pipelines, serialisation formats, and building reliable server-side services. She is an active member of the Python community and enjoys writing practical, example-driven guides that help developers solve real problems without unnecessary theory.

DV
Dmitri VolkovNgười đánh giá kỹ thuật

Dmitri is a DevOps engineer who relies on Python as his primary scripting and automation language. He builds internal tooling, CI/CD pipelines, and infrastructure automation scripts that run in production across distributed teams. He writes about the Python standard library, subprocess management, file processing, encoding utilities, and the practical shell-adjacent Python that DevOps engineers use every day.