Decode Base64 Python โ€” Panduan base64.b64decode()

ยทBackend DeveloperยทDitinjau olehDmitri VolkovยทDiterbitkan

Gunakan Base64 Decode Online gratis langsung di browser Anda โ€” tidak perlu instalasi.

Coba Base64 Decode Online Online โ†’

Saat API mengembalikan field content yang terlihat seperti eyJob3N0IjogImRiLXByb2Qiโ€ฆ, atau secrets manager memberikan kredensial yang sudah dikodekan, atau Anda perlu mengekstrak payload JWTโ€”โ€” dekode base64 Python adalah langkah pertama Anda. Modul base64 bawaan menangani semuanya, namun detail kecil seputar bytes vs string, alfabet yang aman untuk URL, dan padding yang hilang selalu menjebak hampir setiap developer setidaknya sekaliโ€”โ€” saya sudah men-debug kategori error ini di code review lebih banyak dari yang ingin saya akui. Panduan ini mencakup base64.b64decode(), urlsafe_b64decode(), perbaikan padding otomatis, dekode dari file dan respons HTTP, alat CLI, validasi input, dan empat kesalahan umum dengan perbaikan sebelum/sesudahโ€”โ€”semua contoh Python 3.8+ yang bisa dijalankan. Jika Anda hanya perlu dekode cepat sekali tanpa menulis kode, Dekoder Base64 ToolDeck menangani Base64 standar dan yang aman untuk URL secara instan di browser Anda.

  • โœ“base64.b64decode(s) sudah tersedia di Python stdlib โ€” tidak perlu instalasi; selalu mengembalikan bytes, bukan str.
  • โœ“Sambungkan .decode("utf-8") setelah b64decode() untuk mengonversi bytes ke string Python โ€” fungsi ini tidak mengetahui encoding teks aslinya.
  • โœ“Untuk Base64 yang aman untuk URL (menggunakan - dan _ sebagai pengganti + dan /), gunakan base64.urlsafe_b64decode() โ€” standar di JWT, token OAuth, dan kredensial Google API.
  • โœ“Perbaiki error "Incorrect padding" yang umum dengan: padded = s + "=" * (-len(s) % 4) โ€” menambahkan 0, 1, atau 2 karakter sesuai kebutuhan.
  • โœ“Atur validate=True pada input dari sumber eksternal untuk memunculkan binascii.Error pada karakter non-Base64, bukan melewatinya secara diam-diam.

Apa itu Dekoding Base64?

Base64 adalah skema encoding yang merepresentasikan data biner arbitrer sebagai string dari 64 karakter ASCII yang dapat dicetak: Aโ€“Z, aโ€“z, 0โ€“9, +, dan /, dengan = digunakan sebagai padding. Setiap 4 karakter Base64 mengkodekan tepat 3 byte asli, sehingga bentuk yang dikodekan kira-kira 33% lebih besar dari sumbernya. Dekoding membalik prosesnya โ€” mengubah representasi ASCII kembali menjadi byte asli.

Base64 tidak mengenkripsi data. Ini murni encoding biner-ke-teks โ€” string yang dikodekan dapat dibaca sepenuhnya oleh siapa saja yang menjalankannya melalui dekoder:

Sebelum โ€” dikodekan Base64

eyJob3N0IjogImRiLXByb2QubXljb21wYW55LmludGVybmFsIiwgInBvcnQiOiA1NDMyLCAidXNlciI6ICJhcHBfc3ZjIn0=

Sesudah โ€” didekode

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

base64.b64decode() โ€” Dekoding Pustaka Standar

Modul base64 Python disertakan bersama pustaka standarโ€”โ€”tidak perlu instalasi, selalu tersedia. Fungsi utamanya adalah base64.b64decode(s, altchars=None, validate=False). Fungsi ini menerima str, bytes, atau bytearray, dan selalu mengembalikan bytes.

Contoh minimal yang berfungsi

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
Catatan:b64decode() selalu mengembalikan bytes โ€” bukan string. Jika data aslinya adalah teks, sambungkan .decode("utf-8"). Jika itu biner (gambar, PDF, arsip gzip), simpan bytes apa adanya dan tulis ke file atau teruskan langsung ke pustaka yang membutuhkannya.

Contoh diperluas: sort_keys, ensure_ascii, dan validasi ketat

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}")

Mendekode Base64 yang Aman untuk URL (base64url)

Base64 standar menggunakan + dan /, yang merupakan karakter yang dicadangkan dalam URL. Varian yang aman untuk URL (RFC 4648 ยง5, juga disebut โ€œbase64urlโ€) menggantinya dengan - dan _. Ini adalah encoding yang digunakan dalam token JWT, tantangan OAuth 2.0 PKCE, kredensial Google Cloud, dan sebagian besar alur autentikasi web modern.

Memberikan Base64 yang aman untuk URL ke b64decode() tanpa menyesuaikan alfabet akan merusak data secara diam-diam atau memunculkan binascii.Error. Gunakan base64.urlsafe_b64decode() sebagai gantinya โ€” ini menangani penggantian- โ†’ + dan _ โ†’ / secara otomatis.

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
Catatan:Ekspresi "=" * (-len(s) % 4) menambahkan tepat 0, 1, atau 2 karakter padding sesuai kebutuhan dan merupakan no-op ketika string sudah dipadding dengan benar. Ini adalah perbaikan Python idiomatis untuk masalah padding JWT dan OAuth.

Referensi Parameter base64.b64decode()

Semua parameter di bawah ini berlaku untuk b64decode() dan urlsafe_b64decode(), kecuali altchars yang hanya tersedia di b64decode().

ParameterTipeDefaultDeskripsi
sbytes | str | bytearrayโ€”Input yang dikodekan Base64 untuk didekode; ASCII str diterima bersama tipe bytes.
altcharsbytes | NoneNoneUrutan 2-byte yang menggantikan + dan /; memungkinkan alfabet Base64 kustom di luar varian aman untuk URL standar.
validateboolFalseSaat True, memunculkan binascii.Error pada karakter di luar alfabet Base64; saat False, byte non-alfabet (baris baru, spasi) diabaikan secara diam-diam.

Default validate=False disengaja untuk data berformat PEM dan Base64 multi-baris (di mana baris baru umum terjadi). Untuk payload API, unggahan pengguna, atau input yang tidak terpercaya, berikan validate=True untuk mendeteksi data yang rusak atau disuntikkan lebih awal dan menampilkan error yang jelas.

Error Padding Dekode Base64 Python โ€” Cara Memperbaikinya

Error yang paling sering muncul saat mendekode Base64 di Python adalah:

Python 3.8+
import base64

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

Base64 membutuhkan panjang string yang merupakan kelipatan 4. Saat data melewati URL, header HTTP, atau pustaka JWT, padding = di akhir dihapus untuk menghemat byte. Ada dua cara yang dapat diandalkan untuk memperbaikinya.

Opsi 1: Pulihkan padding secara inline (direkomendasikan)

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

Opsi 2: Dekode aman untuk URL dengan padding untuk 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

Mendekode Base64 dari File dan Respons API

Membaca Base64 dari disk dan mendekode payload API adalah dua skenario produksi yang paling umum. Keduanya memerlukan penanganan error yang tepat โ€” padding yang rusak dan tipe biner yang tidak terduga adalah kejadian nyata, bukan kasus tepi yang teoritis.

Membaca dan mendekode file 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")

Mendekode Base64 dari respons API HTTP

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
Catatan:Jika Anda menggunakan pustaka requests, ganti urllib.request dengan resp = requests.get(url, timeout=5, headers=headers) dan body = resp.json(). Logika dekoding Base64 identik.

Dekoding Base64 Lewat Baris Perintah

Untuk inspeksi terminal cepat โ€” memverifikasi token, mengintip blob konfigurasi yang dikodekan, atau menyalurkan output API melalui dekoder โ€” perintah base64 tersedia di Linux dan macOS. Modul -m base64 bawaan Python bekerja lintas platform termasuk 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))
"

Untuk pekerjaan eksplorasi di mana menulis pipeline shell terasa berlebihan, tempelkan string ke Dekoder Base64 online โ€” ia mendeteksi input yang aman untuk URL secara otomatis dan memperbaiki padding di tempat.

Memvalidasi Input Base64 Sebelum Mendekode

Saat data Base64 datang dari input pengguna, webhook, atau API pihak ketiga yang tidak terpercaya, validasilah sebelum mendekode untuk menampilkan error yang bersih dan dapat ditindaklanjuti, bukan traceback binascii.Error yang membingungkan jauh di dalam logika bisnis. Python memberi Anda dua pendekatan: tangkap exception, atau pra-validasi dengan 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)

Alternatif Berkinerja Tinggi: pybase64

Untuk sebagian besar kasus penggunaan, modul base64 stdlib Python sudah sepenuhnya memadai. Jika Anda memproses ribuan payload API per detik, mendekode lampiran biner multi-megabyte dalam loop ketat, atau profiler Anda menunjukkan operasi Base64 sebagai titik panas โ€” pertimbangkan pybase64. Ini adalah wrapper ekstensi C di sekitar libbase64 dan biasanya 2โ€“5ร— lebih cepat dari implementasi stdlib pada input besar.

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-nya sengaja dibuat identik dengan base64 โ€” ganti impor dan tidak ada yang berubah. Gunakan hanya saat profiling mengonfirmasi bahwa Base64 memang menjadi bottleneck, yang jarang terjadi di luar pipeline data throughput tinggi.

Kesalahan Umum

Saya telah melihat keempat error ini berulang kali dalam code review โ€” mereka sangat umum di antara developer yang berasal dari bahasa seperti JavaScript atau PHP di mana dekode Base64 mengembalikan string secara langsung, atau dari tutorial yang melewatkan penanganan error sepenuhnya.

Kesalahan 1: Lupa memanggil .decode() pada hasilnya

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

Kesalahan 2: Menggunakan b64decode() pada input Base64 yang aman untuk 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}

Kesalahan 3: Tidak memperbaiki padding pada token yang sudah dipangkas

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

Kesalahan 4: Memanggil .decode("utf-8") pada data biner

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")

Mendekode File Base64 Besar di Python

Memuat file Base64 200 MB dengan Path.read_text() dan mendekodenya dalam satu panggilan akan mengalokasikan string yang dikodekan, byte yang didekode, dan representasi perantara secara bersamaan โ€” dengan mudah menghabiskan memori di server yang terbatas atau fungsi Lambda. Untuk file yang lebih besar dari ~50โ€“100 MB, gunakan pendekatan chunked sebagai gantinya.

Dekoding chunked ke disk (tanpa memuat seluruh file ke 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")

Mendekode Base64 dengan base64.decodebytes() untuk data PEM / multi-baris

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")
Catatan:Gunakan base64.decodebytes() untuk sertifikat PEM, lampiran MIME, dan Base64 apa pun yang mengapit di lebar baris tetap. Gunakan pendekatan chunked di atas untuk blob besar yang buram (cadangan, file media). Untuk token satu baris yang ringkas (JWT, OAuth), b64decode() atau urlsafe_b64decode() selalu menjadi pilihan yang tepat.

Metode Dekoding Base64 Python โ€” Perbandingan Cepat

MetodeAlfabetPaddingOutputPerlu InstalTerbaik Untuk
base64.b64decode()Standar (Aโ€“Z aโ€“z 0โ€“9 +/)DiperlukanbytesTidak (stdlib)Serba guna, email, PEM
base64.decodebytes()Standar (Aโ€“Z aโ€“z 0โ€“9 +/)Diabaikan (hapus spasi)bytesTidak (stdlib)Sertifikat PEM, lampiran MIME, Base64 multi-baris
base64.urlsafe_b64decode()Aman untuk URL (Aโ€“Z aโ€“z 0โ€“9 -_)DiperlukanbytesTidak (stdlib)JWT, OAuth, Google Cloud API
base64.b32decode()32-karakter (Aโ€“Z, 2โ€“7)DiperlukanbytesTidak (stdlib)Rahasia TOTP, ID aman DNS
base64.b16decode()Hex (0โ€“9, Aโ€“F)Tidak adabytesTidak (stdlib)Checksum berenkode hex, hash
pybase64.b64decode()Standar (Aโ€“Z aโ€“z 0โ€“9 +/)DiperlukanbytesYa (pip)Pipeline throughput tinggi, payload besar
CLI: base64 --decodeStandarOtomatisstdoutTidak (sistem)Inspeksi terminal cepat

Gunakan b64decode() sebagai default Anda. Beralih ke urlsafe_b64decode()segera saat Anda melihat - atau _ dalam input โ€” karakter tersebut adalah tanda Base64 yang aman untuk URL yang tidak dapat disalahartikan. Gunakan pybase64 hanya setelah profiling mengonfirmasi bottleneck. Untuk pemeriksaan sekali pakai selama pengembangan, Dekoder Base64 ToolDeck menangani kedua alfabet dan memperbaiki padding secara otomatis โ€” tidak perlu lingkungan Python.

Pertanyaan yang Sering Diajukan

Bagaimana cara mendekode string Base64 menjadi string biasa di Python?

Panggil base64.b64decode(encoded) untuk mendapatkan bytes, lalu panggil .decode("utf-8")pada hasilnya untuk mendapatkan str Python. Dua langkah ini selalu terpisah karena b64decode() hanya membalik alfabet Base64 โ€” ia tidak mengetahui apakah konten aslinya UTF-8, Latin-1, atau biner. Jika data menggunakan encoding non-UTF-8, berikan nama codec yang benar ke .decode(), misalnya .decode("latin-1").

Mengapa saya mendapatkan "Incorrect padding" saat mendekode Base64 di Python?

String Base64 harus memiliki panjang yang merupakan kelipatan 4 karakter. JWT, token OAuth, dan data yang dikirim dalam URL sering menanggalkan padding = di akhir. Perbaikinya dengan menambahkan "=" * (-len(s) % 4) sebelum mendekode. Formula ini menambahkan tepat 0, 1, atau 2 karakter sesuai kebutuhan, dan merupakan no-op yang aman ketika string sudah dipadding dengan benar.

Apa perbedaan antara b64decode() dan urlsafe_b64decode() di Python?

Keduanya mendekode algoritma Base64 yang sama tetapi dengan alfabet yang berbeda untuk karakter ke-62 dan ke-63.b64decode() menggunakan + dan /; urlsafe_b64decode() menggunakan - dan _. Varian yang aman untuk URL didefinisikan dalam RFC 4648 ยง5 dan digunakan di mana pun Base64 harus bertahan dalam URL, header HTTP, atau nilai cookie tanpa percent-encoding. Mencampurnya menyebabkan binascii.Error atau output yang rusak secara diam-diam.

Bagaimana cara mendekode gambar yang dikodekan Base64 di Python?

Dekode ke bytes dengan base64.b64decode(encoded), lalu tulis byte tersebut langsung ke file โ€” jangan panggil .decode("utf-8") pada data gambar. Jika inputnya adalah data URL (misalnya data:image/png;base64,iVBORw0KGgoโ€ฆ), hapus prefiks terlebih dahulu:

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")

Bisakah saya mendekode Base64 di Python tanpa mengimpor modul apa pun?

Secara teknis bisa, tetapi tidak ada alasan untuk melakukannya. Modul base64 adalah bagian dari pustaka standar Python, selalu tersedia, selalu terinstal โ€” tidak memiliki dependensi dan fungsinya diimplementasikan dalam C. Mengimplementasikan ulang Base64 dari awal akan lebih lambat, lebih rentan error, dan lebih sulit dipelihara. Selalu gunakan import base64.

Bagaimana cara mendekode Base64 di Python ketika inputnya adalah bytes, bukan string?

base64.b64decode() menerima str, bytes, dan bytearray secara bergantian โ€” tidak perlu konversi. Jika Anda menerima b"SGVsbG8=" dari socket atau pembacaan file, teruskan langsung. Perbaikan padding bekerja dengan cara yang sama dalam mode bytes: data + b"=" * (-len(data) % 4) saat beroperasi dalam mode bytes.

Alat Terkait

  • Enkode Base64 โ€” enkode teks atau file biner ke Base64 secara instan; berguna untuk menghasilkan fixture pengujian untuk kode dekoding Python Anda tanpa menjalankan skrip.
  • Dekoder JWT โ€” periksa header dan payload JWT tanpa menulis kode; payload didekode dengan Base64 yang aman untuk URL di balik layar, persis seperti yang ditunjukkan dalam contoh di atas.
  • Dekode URL โ€” percent-decode string kueri dan segmen jalur; sering diperlukan bersama dekoding Base64 saat mengurai URL callback OAuth atau payload webhook.
  • Enkode URL โ€” percent-encode karakter khusus; berguna saat Anda perlu menyematkan nilai yang dikodekan Base64 dengan aman di dalam parameter kueri URL.
Tersedia juga dalam: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 VolkovPeninjau teknis

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.