ToolDeck

Java-তে Base64 Decode — getDecoder().decode() গাইড

·Backend Engineer·পর্যালোচনা করেছেনAisha Osei·প্রকাশিত

বিনামূল্যে অনলাইন Base64 ডিকোড অনলাইন সরাসরি আপনার ব্রাউজারে ব্যবহার করুন — ইনস্টলের প্রয়োজন নেই।

Base64 ডিকোড অনলাইন অনলাইনে ব্যবহার করুন →

Java তে Base64 ডিকোড করার প্রয়োজন আমার প্রায়ই পড়ে — Kubernetes এনভায়রনমেন্ট ভেরিয়েবল থেকে সিক্রেট বের করা, REST API থেকে বাইনারি পেলোড পড়া, ডিবাগিং সেশনে JWT টোকেন পরীক্ষা করা। Java-র বিল্ট-ইন java.util.Base64 ক্লাস (JDK 8 থেকে) তিনটি ডিকোডার ফ্লেভার প্রদান করে: getDecoder() স্ট্যান্ডার্ড Base64 এর জন্য, getUrlDecoder() URL-safe ইনপুটের জন্য, এবং getMimeDecoder() ইমেইল অ্যাটাচমেন্টের মতো লাইন-র‍্যাপড ডেটার জন্য। কোড না লিখে একবার দেখে নিতে চাইলে, ToolDeck-এর Base64 ডিকোডার ব্রাউজারেই কাজ সারে। এই গাইড Java 8+ এর জন্য লেখা। এখানে তিনটি ডিকোডার, wrap(InputStream) দিয়ে স্ট্রিমিং, JWT পেলোড এক্সট্রাকশন, ফাইল ও API রেসপন্স ডিকোডিং, Apache Commons Codec বিকল্প, এবং প্রোডাকশনে ভুল আউটপুট তৈরি করে এমন চারটি সাধারণ ভুল কভার করা হয়েছে।

  • Base64.getDecoder().decode(s) হল স্ট্যান্ডার্ড পদ্ধতি — JDK 8 থেকে java.util.Base64 এ বিল্ট-ইন, কোনো ডিপেন্ডেন্সি প্রয়োজন নেই।
  • JWT টোকেন এবং OAuth পেলোডের জন্য getUrlDecoder() ব্যবহার করুন — এগুলো + এবং / এর পরিবর্তে - এবং _ অ্যালফাবেট ব্যবহার করে।
  • getMimeDecoder() লাইন ব্রেক এবং হোয়াইটস্পেস উপেক্ষা করে, এটি ইমেইল অ্যাটাচমেন্ট এবং PEM সার্টিফিকেটের জন্য সঠিক পছন্দ।
  • decoder.wrap(InputStream) বড় ফাইলের জন্য সবকিছু মেমোরিতে লোড না করে রানটাইমে ডিকোড করে।
  • বেসিক ডিকোডার কঠোর — ট্রেইলিং নিউলাইন, স্পেস, বা ভুল অ্যালফাবেট ক্যারেক্টার থাকলে সাথে সাথে IllegalArgumentException থ্রো করে।

Base64 ডিকোডিং কী?

Base64 এনকোডিং বাইনারি ডেটাকে একটি ৬৪-ক্যারেক্টারের ASCII উপস্থাপনায় রূপান্তর করে যাতে এটি টেক্সট-অনলি চ্যানেলে নিরাপদে যেতে পারে — JSON ফিল্ড, HTTP হেডার, XML ডকুমেন্ট, ইমেইল বডি। ডিকোডিং হল এর উল্টো প্রক্রিয়া: প্রতি ৪টি Base64 ক্যারেক্টার মূল ৩টি বাইটে ফিরে আসে। শেষের = প্যাডিং নির্দেশ করে শেষ গ্রুপ পূরণ করতে কতটি বাইট যোগ করা হয়েছিল। Base64 এনক্রিপশন নয় — যে কেউ এটি ডিকোড করতে পারে। এটি ডেটা ট্রান্সপোর্টের সুবিধার জন্য, গোপনীয়তার জন্য নয়।

সাধারণ Java ডিকোডিং পরিস্থিতি: Base64 এনভায়রনমেন্ট ভেরিয়েবল হিসেবে ইনজেক্ট করা কনফিগারেশন মান এক্সট্রাক্ট করা, ক্লাউড API রেসপন্স থেকে বাইনারি ফাইল কন্টেন্ট আনপ্যাক করা, PEM-এনকোডেড সার্টিফিকেট পড়া, এবং ডিবাগিংয়ের সময় JWT টোকেন পেলোড পরীক্ষা করা।

Before · text
After · text
ZGItcHJvZC51cy1lYXN0LTEuYW1hem9uYXdzLmNvbTo1NDMy
db-prod.us-east-1.amazonaws.com:5432

Base64.getDecoder().decode() — স্ট্যান্ডার্ড ডিকোডিং মেথড

java.util.Base64 ক্লাসটি JDK 8 এ যোগ করা হয়েছিল এবং পুরনো sun.misc.BASE64Decoder কে প্রতিস্থাপন করেছে যার উপর সবাই নির্ভর করত। কোনো বাহ্যিক ডিপেন্ডেন্সি প্রয়োজন নেই — শুধু import java.util.Base64 করুন এবং Base64.getDecoder().decode() কল করুন। মেথডটি একটি String বা byte[] নেয় এবং ডিকোড করা ডেটার byte[] রিটার্ন করে।

সহজ উদাহরণ

Java 8+
import java.util.Base64;
import java.nio.charset.StandardCharsets;

public class DecodeCredential {
    public static void main(String[] args) {
        // Kubernetes secret value, Base64-encoded
        String encoded = "ZGItcHJvZC51cy1lYXN0LTEuYW1hem9uYXdzLmNvbTo1NDMy";

        byte[] decodedBytes = Base64.getDecoder().decode(encoded);
        String connectionString = new String(decodedBytes, StandardCharsets.UTF_8);

        System.out.println(connectionString);
        // db-prod.us-east-1.amazonaws.com:5432
    }
}

String তৈরি করার সময় সবসময় StandardCharsets.UTF_8 নির্দিষ্ট করুন। আর্গুমেন্ট-ছাড়া new String(bytes) কনস্ট্রাক্টর প্ল্যাটফর্মের ডিফল্ট এনকোডিং ব্যবহার করে, যা সিস্টেমের মধ্যে ভিন্ন হয়। ডিফল্ট হিসেবে Cp1252 সহ একটি Windows সার্ভারে, মাল্টি-বাইট UTF-8 ক্যারেক্টার নীরবে নষ্ট হয়।

রাউন্ড-ট্রিপ যাচাইকরণ

Java 8+
import java.util.Base64;
import java.nio.charset.StandardCharsets;

public class RoundTrip {
    public static void main(String[] args) {
        String original = "redis://cache-prod.internal:6379/session-store";

        String encoded = Base64.getEncoder().encodeToString(
            original.getBytes(StandardCharsets.UTF_8)
        );
        System.out.println(encoded);
        // cmVkaXM6Ly9jYWNoZS1wcm9kLmludGVybmFsOjYzNzkvc2Vzc2lvbi1zdG9yZQ==

        byte[] decoded = Base64.getDecoder().decode(encoded);
        String recovered = new String(decoded, StandardCharsets.UTF_8);

        System.out.println(recovered.equals(original)); // true
    }
}

আগে থেকে তৈরি বাফারে ডিকোড করা

তিন-আর্গুমেন্ট decode(byte[] src, byte[] dst) ওভারলোড সরাসরি একটি ডেস্টিনেশন বাফারে লেখে এবং লেখা বাইটের সংখ্যা রিটার্ন করে। হট পাথে বারবার অ্যালোকেশন এড়াতে কাজে আসে:

Java 8+
import java.util.Base64;

public class DecodeToBuffer {
    public static void main(String[] args) {
        byte[] src = "eyJob3N0IjoiMTAuMC4xLjUwIiwicG9ydCI6ODQ0M30=".getBytes();
        byte[] dst = new byte[1024]; // pre-allocated

        int len = Base64.getDecoder().decode(src, dst);
        String result = new String(dst, 0, len);

        System.out.println(result);
        // {"host":"10.0.1.50","port":8443}
    }
}
নোট:decode() ইনপুটে Base64 অ্যালফাবেটের বাইরে ক্যারেক্টার থাকলে (লাইন ব্রেক এবং স্পেস সহ) IllegalArgumentException থ্রো করে। আপনার ইনপুটে হোয়াইটস্পেস থাকতে পারলে, getMimeDecoder() তে সুইচ করুন বা ডিকোডিংয়ের আগে encoded.strip() দিয়ে সরিয়ে দিন।

নন-স্ট্যান্ডার্ড টাইপ এবং কাস্টম অবজেক্ট সহ Base64 ডিকোড করা

decode() থেকে raw byte[] প্রায়ই আরও নির্দিষ্ট কিছুতে পরিণত করতে হয়: একটি UUID, একটি সিরিয়ালাইজড Java অবজেক্ট, একটি protobuf মেসেজ, বা একটি টাইমস্ট্যাম্প। ডিকোডার সবসময় শুধু বাইট দেয় — বাকিটা আপনাকেই convert করে নিতে হবে।

Base64 থেকে UUID

Java 8+
import java.util.Base64;
import java.nio.ByteBuffer;
import java.util.UUID;

public class DecodeUUID {
    public static UUID fromBase64(String encoded) {
        byte[] bytes = Base64.getUrlDecoder().decode(encoded);
        ByteBuffer bb = ByteBuffer.wrap(bytes);
        return new UUID(bb.getLong(), bb.getLong());
    }

    public static void main(String[] args) {
        // Compact Base64-encoded UUID from an API response
        String encoded = "f47ac10b-58cc-4372-a567-0e02b2c3d479";
        UUID original = UUID.fromString(encoded);

        // Encode to Base64 (compact form — 22 chars vs 36)
        ByteBuffer bb = ByteBuffer.wrap(new byte[16]);
        bb.putLong(original.getMostSignificantBits());
        bb.putLong(original.getLeastSignificantBits());
        String compact = Base64.getUrlEncoder().withoutPadding()
            .encodeToString(bb.array());
        System.out.println(compact); // 9HrBC1jMQ3KlZw4CssPUeQ

        // Decode back
        UUID recovered = fromBase64(compact);
        System.out.println(recovered); // f47ac10b-58cc-4372-a567-0e02b2c3d479
    }
}

Jackson দিয়ে Base64 থেকে ডিসিরিয়ালাইজড JSON অবজেক্ট

Java 8+
import java.util.Base64;
import java.nio.charset.StandardCharsets;
import com.fasterxml.jackson.databind.ObjectMapper;
import java.time.Instant;

public class DecodeJsonPayload {
    record DeployEvent(String service, String region, Instant deployedAt, int replicas) {}

    public static void main(String[] args) throws Exception {
        // Base64-encoded JSON payload from a message queue
        String encoded = "eyJzZXJ2aWNlIjoicGF5bWVudC1nYXRld2F5Iiwi"
            + "cmVnaW9uIjoiZXUtd2VzdC0xIiwiZGVwbG95ZWRBdCI6"
            + "IjIwMjYtMDMtMTVUMTQ6MzA6MDBaIiwicmVwbGljYXMiOjR9";

        byte[] jsonBytes = Base64.getDecoder().decode(encoded);
        String json = new String(jsonBytes, StandardCharsets.UTF_8);
        System.out.println(json);
        // {"service":"payment-gateway","region":"eu-west-1",
        //  "deployedAt":"2026-03-15T14:30:00Z","replicas":4}

        ObjectMapper mapper = new ObjectMapper();
        mapper.findAndRegisterModules(); // picks up JavaTimeModule
        DeployEvent event = mapper.readValue(jsonBytes, DeployEvent.class);

        System.out.println(event.service());   // payment-gateway
        System.out.println(event.deployedAt()); // 2026-03-15T14:30:00Z
    }
}
সতর্কতা:অবিশ্বস্ত Base64 ডেটা ডিসিরিয়ালাইজ করতে কখনো ObjectInputStream ব্যবহার করবেন না। Java ডিসিরিয়ালাইজেশন আক্রমণ ভালোভাবে নথিভুক্ত — এনকোডেড কন্টেন্ট যদি বাহ্যিক উৎস থেকে আসে, তাহলে নেটিভ Java সিরিয়ালাইজেশন ব্যবহার না করে JSON বা protobuf হিসেবে পার্স করুন।

Base64.Decoder মেথড রেফারেন্স

সমস্ত মেথড java.util.Base64 এবং এর ইনার ক্লাস Base64.Decoder এর অন্তর্গত। Base64 এর তিনটি ফ্যাক্টরি মেথড ভিন্ন ডিকোডার ইনস্ট্যান্স রিটার্ন করে; decode() এবং wrap() মেথডগুলো Decoder ইনস্ট্যান্সে থাকে।

মেথড
রিটার্ন
ইনপুট টাইপ
বিবরণ
getDecoder()
Base64.Decoder
স্ট্যান্ডার্ড ডিকোডার (RFC 4648 §4, + এবং / অ্যালফাবেট সহ = প্যাডিং)
getUrlDecoder()
Base64.Decoder
URL-safe ডিকোডার (RFC 4648 §5, - এবং _ অ্যালফাবেট সহ = প্যাডিং)
getMimeDecoder()
Base64.Decoder
MIME ডিকোডার — লাইন সেপারেটর এবং নন-Base64 ক্যারেক্টার উপেক্ষা করে
decode(String src)
byte[]
String
ইনপুট স্ট্রিং ডিকোড করে নতুন byte array তে
decode(byte[] src)
byte[]
byte[]
ইনপুট byte array ডিকোড করে নতুন byte array তে
decode(byte[] src, byte[] dst)
int
byte[] + byte[]
পূর্ব-বরাদ্দ dst বাফারে ডিকোড করে, লেখা বাইটের সংখ্যা রিটার্ন করে
wrap(InputStream is)
InputStream
InputStream
রানটাইমে Base64 ডেটা ডিকোড করে এমন একটি স্ট্রিম রিটার্ন করে

getMimeDecoder() — লাইন-র‍্যাপড এবং MIME Base64 ডিকোড করা

বেসিক ডিকোডার Base64 অ্যালফাবেটের বাইরে যেকোনো কিছু প্রত্যাখ্যান করে — এবং এর মধ্যে MIME-এনকোডেড কন্টেন্টে সবসময় থাকা \r\n লাইন ব্রেকও অন্তর্ভুক্ত। ইমেইল অ্যাটাচমেন্ট, PEM সার্টিফিকেট, এবং কিছু পুরনো API রেসপন্স প্রতি লাইনে ৭৬ ক্যারেক্টারে Base64 আউটপুট র‍্যাপ করে। getMimeDecoder() নীরবে লাইন সেপারেটর এবং Base64 অ্যালফাবেটে নেই এমন যেকোনো ক্যারেক্টার উপেক্ষা করে, তাই এটি আউট-অফ-দ্য-বক্স পরিচালনা করে।

Java 8+
import java.util.Base64;
import java.nio.charset.StandardCharsets;

public class MimeDecode {
    public static void main(String[] args) {
        // PEM certificate body — line-wrapped at 76 characters
        String pemBody = "LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0t\r\n"
            + "TUlJQm96Q0NBVWlnQXdJQkFnSUpBSXBhVDJU\r\n"
            + "aVFvZU1BMEdDU3FHU0liM0RRRU==";

        // getDecoder() would throw IllegalArgumentException here
        byte[] decoded = Base64.getMimeDecoder().decode(pemBody);
        System.out.println(new String(decoded, StandardCharsets.UTF_8));
        // -----BEGIN CERTIFICATE-----
        // MIIBozCCAUigAwIBAgIJAIpaT2T...
    }
}
নোট:getMimeDecoder() উদার: এটি এক্সেপশন থ্রো না করে অবৈধ ক্যারেক্টার এড়িয়ে যায়। পরিচিত MIME ডেটার জন্য এটি ঠিক আছে, কিন্তু অজানা ইনপুটে নীরবে ডেটা নষ্ট করে ফেলতে পারে। কঠোর যাচাইকরণ চাইলে getDecoder() ব্যবহার করুন।

ফাইল এবং API রেসপন্স থেকে Base64 ডিকোড করা

ডিস্ক থেকে Base64-এনকোডেড ফাইল পড়া

বাইনারি ফাইল (ছবি, সার্টিফিকেট, এনক্রিপ্টেড ব্লব) কখনো কখনো ডিস্কে Base64 টেক্সট হিসেবে সংরক্ষিত হয়। ফাইল পড়ুন, ডিকোড করুন, বাইনারি আউটপুট লিখুন:

Java 8+
import java.util.Base64;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;

public class DecodeFile {
    public static void main(String[] args) {
        Path inputPath = Path.of("tls-cert.pem.b64");
        Path outputPath = Path.of("tls-cert.pem");

        try {
            String encoded = Files.readString(inputPath).strip();
            byte[] decoded = Base64.getMimeDecoder().decode(encoded);
            Files.write(outputPath, decoded);

            System.out.printf("Decoded %d bytes → %s%n", decoded.length, outputPath);
        } catch (IOException e) {
            System.err.println("File error: " + e.getMessage());
        } catch (IllegalArgumentException e) {
            System.err.println("Invalid Base64: " + e.getMessage());
        }
    }
}

HTTP API রেসপন্স থেকে Base64 ফিল্ড ডিকোড করা

ক্লাউড API (AWS KMS, GitHub Contents, Vault) প্রায়ই JSON এর ভেতরে Base64 স্ট্রিং হিসেবে বাইনারি ডেটা রিটার্ন করে। প্রথমে JSON পার্স করুন, তারপর টার্গেট ফিল্ড ডিকোড করুন:

Java 11+
import java.util.Base64;
import java.nio.charset.StandardCharsets;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.net.URI;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;

public class DecodeApiResponse {
    public static void main(String[] args) {
        HttpClient client = HttpClient.newHttpClient();
        HttpRequest request = HttpRequest.newBuilder()
            .uri(URI.create("https://api.example.com/secrets/db-password"))
            .header("Authorization", "Bearer sk-prod-9f8e7d6c")
            .build();

        try {
            HttpResponse<String> response = client.send(
                request, HttpResponse.BodyHandlers.ofString());

            if (response.statusCode() != 200) {
                System.err.printf("Unexpected status: %d%n", response.statusCode());
                return;
            }

            ObjectMapper mapper = new ObjectMapper();
            JsonNode root = mapper.readTree(response.body());

            // API returns: {"name":"db-password","value":"cG9zdGdyZXM6eGs5...","version":3}
            String encodedValue = root.get("value").asText();
            byte[] decoded = Base64.getDecoder().decode(encodedValue);
            String secret = new String(decoded, StandardCharsets.UTF_8);

            System.out.println("Secret: " + secret);
            // Secret: postgres:xk9mP2qR@db-prod:5432/orders
        } catch (Exception e) {
            System.err.println("Failed to fetch secret: " + e.getMessage());
        }
    }
}
নোট:নেটওয়ার্ক এররের থেকে আলাদা করে IllegalArgumentException এর জন্য decode কলকে নিজস্ব try-catch এ র‍্যাপ করুন। I/O এক্সেপশনের সাথে ডিকোডিং ব্যর্থতা মেশালে ডিবাগিং কঠিন হয় — API খারাপ ডেটা রিটার্ন করেছে নাকি নেটওয়ার্ক ব্যর্থ হয়েছে তা আপনি তাৎক্ষণিকভাবে জানতে চাইবেন।

কমান্ড লাইন থেকে Base64 ডিকোড করা

সবসময় Java প্রোগ্রামের প্রয়োজন নেই। প্রতিটি Linux এবং macOS সিস্টেমে একটি base64 কমান্ড আছে, এবং JDK 9+ ইন্টারেক্টিভ Java ওয়ান-লাইনারের জন্য jshell শিপ করে। ডিবাগিংয়ের সময় দ্রুত পরীক্ষার জন্য, এগুলো একটি ক্লাস কম্পাইল করার চেয়ে দ্রুত।

bash
# Decode a Base64 string (Linux / macOS)
echo "eyJob3N0IjoiMTAuMC4xLjUwIiwicG9ydCI6ODQ0M30=" | base64 --decode
# {"host":"10.0.1.50","port":8443}

# Decode and pretty-print with jq
echo "eyJob3N0IjoiMTAuMC4xLjUwIiwicG9ydCI6ODQ0M30=" | base64 --decode | jq .
# {
#   "host": "10.0.1.50",
#   "port": 8443
# }

# Quick decode with jshell (JDK 9+)
echo 'System.out.println(new String(java.util.Base64.getDecoder().decode("c2VydmVyLWNvbmZpZw==")))' | jshell -
# server-config

# macOS uses -D instead of --decode
echo "c2VydmVyLWNvbmZpZw==" | base64 -D

এনকোডেড স্ট্রিং সরাসরি ব্রাউজারে পেস্ট করতে, ToolDeck-এর Base64 ডিকোডার কোনো সেটআপ ছাড়াই স্ট্যান্ডার্ড এবং URL-safe উভয় ভ্যারিয়েন্ট পরিচালনা করে।

উচ্চ-পারফরম্যান্স বিকল্প: Apache Commons Codec

Java-র বিল্ট-ইন java.util.Base64 ইতিমধ্যে ভালোভাবে অপ্টিমাইজড — JDK 11+ এনকোডিং এবং ডিকোডিংয়ের জন্য x86 এ intrinsics ব্যবহার করে। বেশিরভাগ অ্যাপ্লিকেশনের জন্য, থার্ড-পার্টি লাইব্রেরির কাছে পৌঁছানোর কোনো কারণ নেই। তবে, Apache Commons Codec লিগেসি কোডবেসে জনপ্রিয় থাকে এবং স্বয়ংক্রিয় হোয়াইটস্পেস হ্যান্ডলিং সহ স্ট্রিমিং ডিকোডিংয়ের জন্য Base64InputStream অফার করে।

XML (Maven)
<!-- pom.xml -->
<dependency>
    <groupId>commons-codec</groupId>
    <artifactId>commons-codec</artifactId>
    <version>1.17.0</version>
</dependency>
Java 8+
import org.apache.commons.codec.binary.Base64;

public class CommonsCodecDecode {
    public static void main(String[] args) {
        // Commons Codec is more lenient — handles whitespace and line breaks
        String encoded = "eyJob3N0IjoiMTAuMC4xLjUw\nIiwicG9ydCI6ODQ0M30=";
        byte[] decoded = Base64.decodeBase64(encoded);

        System.out.println(new String(decoded));
        // {"host":"10.0.1.50","port":8443}
    }
}

বিল্ট-ইন API-এর তুলনায় Commons Codec এর প্রধান সুবিধা হল ডিফল্টভাবে হোয়াইটস্পেস সহ এর উদারতা এবং Base64InputStream ক্লাস যা Java-র decoder.wrap() এর আগে থেকে আছে। Java 8+ এ থাকলে, বিল্ট-ইন API সব কিছু কভার করে যা Commons Codec করে। আমি শুধু Commons Codec তখনই ব্যবহার করি যখন প্রজেক্ট ইতিমধ্যে এটির উপর নির্ভরশীল।

decoder.wrap() দিয়ে বড় Base64 ফাইল স্ট্রিম করা

Files.readString() দিয়ে একটি ২০০ MB Base64 ফাইল লোড করে তারপর decode() কল করলে প্রায় ৩৫০ MB হিপ অ্যালোকেট হয়: এনকোডেড স্ট্রিং এবং ডিকোডেড byte array। decoder.wrap(InputStream) রানটাইমে ডিকোড করে, মেমোরি ব্যবহার স্থিতিশীল রাখে।

Java 8+
import java.util.Base64;
import java.io.*;
import java.nio.file.*;

public class StreamDecode {
    public static void main(String[] args) throws IOException {
        Path src = Path.of("database-dump.sql.b64");
        Path dst = Path.of("database-dump.sql");

        try (InputStream in = Base64.getMimeDecoder().wrap(
                 new BufferedInputStream(Files.newInputStream(src)));
             OutputStream out = new BufferedOutputStream(Files.newOutputStream(dst))) {

            byte[] buffer = new byte[8192];
            int bytesRead;
            long total = 0;
            while ((bytesRead = in.read(buffer)) != -1) {
                out.write(buffer, 0, bytesRead);
                total += bytesRead;
            }
            System.out.printf("Decoded %d bytes → %s%n", total, dst);
        }
    }
}

Java 9+ এ রিড লুপ in.transferTo(out) দিয়ে প্রতিস্থাপন করা যায় — এটি কম কোডে একই কাজ করে। ফাইলে লাইন ব্রেক থাকতে পারলে (PEM ফাইল, ইমেইল এক্সপোর্ট) getDecoder().wrap() এর বদলে getMimeDecoder().wrap() ব্যবহার করুন।

Java 9+
import java.util.Base64;
import java.io.*;
import java.nio.file.*;

public class StreamDecodeSimple {
    public static void main(String[] args) throws IOException {
        try (InputStream in = Base64.getMimeDecoder().wrap(
                 new BufferedInputStream(Files.newInputStream(Path.of("backup.tar.b64"))));
             OutputStream out = Files.newOutputStream(Path.of("backup.tar"))) {
            in.transferTo(out); // Java 9+
        }
    }
}
সতর্কতা:getDecoder().wrap() স্ট্রিমে লাইন ব্রেক সহনশীল নয়। Base64 ডেটায় নিউলাইন থাকলে (৭৬ অক্ষরে লাইন-র‍্যাপড), তার বদলে getMimeDecoder().wrap() ব্যবহার করুন — নাহলে স্ট্রিম নীরবে দূষিত আউটপুট তৈরি করে বা অপ্রত্যাশিত রিড পজিশনে থ্রো করে।

Java তে JWT লাইব্রেরি ছাড়া Base64 JWT পেলোড ডিকোড করা

JWT হল ডট দিয়ে আলাদা করা তিনটি Base64url-এনকোডেড সেগমেন্ট। মাঝের সেগমেন্টটি হল পেলোড — ডিবাগিংয়ে যেটা দেখতে চান। jjwt বা Nimbus না টেনে এটি ডিকোড করা যায়। . এ স্প্লিট করুন, দ্বিতীয় অংশ getUrlDecoder() দিয়ে ডিকোড করুন, এবং ফলস্বরূপ JSON পার্স করুন:

Java 8+
import java.util.Base64;
import java.nio.charset.StandardCharsets;

public class JWTInspect {
    public static String decodeJwtPayload(String token) {
        String[] parts = token.split("\\.");
        if (parts.length != 3) {
            throw new IllegalArgumentException(
                "Invalid JWT: expected 3 segments, got " + parts.length);
        }
        // JWT uses URL-safe Base64 without padding
        byte[] payload = Base64.getUrlDecoder().decode(parts[1]);
        return new String(payload, StandardCharsets.UTF_8);
    }

    public static void main(String[] args) {
        String token = "eyJhbGciOiJSUzI1NiJ9"
            + ".eyJzdWIiOiJ1c3ItNjcyIiwiaXNzIjoiYXV0aC5leGFtcGxlLmNvbSIs"
            + "ImV4cCI6MTc0MTk1NjgwMCwicm9sZXMiOlsiYWRtaW4iLCJiaWxsaW5nIl19"
            + ".SIGNATURE_PLACEHOLDER";

        String payload = decodeJwtPayload(token);
        System.out.println(payload);
        // {"sub":"usr-672","iss":"auth.example.com",
        //  "exp":1741956800,"roles":["admin","billing"]}
    }
}

সাধারণ ভুল

কোড রিভিউতে আমি এগুলো বারবার দেখেছি — প্রথম দুটো Java সার্ভিসে বেশিরভাগ Base64-সম্পর্কিত প্রোডাকশন বাগের মূল কারণ।

URL-safe ইনপুটে getDecoder() ব্যবহার করা

সমস্যা: JWT টোকেন এবং OAuth অ্যাক্সেস টোকেন URL-safe অ্যালফাবেট (- এবং _) ব্যবহার করে। এগুলো getDecoder() তে পাস করলে IllegalArgumentException থ্রো হয় কারণ - স্ট্যান্ডার্ড Base64 অ্যালফাবেটে নেই।

সমাধান: আপনার ডেটা উৎস পরীক্ষা করুন: auth সিস্টেম থেকে টোকেনের জন্য getUrlDecoder() দরকার; MIME অ্যাটাচমেন্টের জন্য getMimeDecoder() দরকার।

Before · Java
After · Java
// JWT header — URL-safe, no padding
String header = "eyJhbGciOiJSUzI1NiJ9";
byte[] decoded = Base64.getDecoder().decode(header);
// IllegalArgumentException: Illegal base64 character 2d
String header = "eyJhbGciOiJSUzI1NiJ9";
byte[] decoded = Base64.getUrlDecoder().decode(header);
System.out.println(new String(decoded));
// {"alg":"RS256"}
String তৈরিতে charset নির্দিষ্ট না করা

সমস্যা: new String(bytes) JVM-এর ডিফল্ট charset ব্যবহার করে, যা পরিবেশের মধ্যে ভিন্ন হয়। একটি Linux CI সার্ভার (UTF-8) এবং একটি Windows প্রোডাকশন হোস্ট (Cp1252) একই বাইটের জন্য ভিন্ন ফলাফল তৈরি করে।

সমাধান: সবসময় দ্বিতীয় আর্গুমেন্ট হিসেবে StandardCharsets.UTF_8 পাস করুন।

Before · Java
After · Java
byte[] decoded = Base64.getDecoder().decode(encoded);
String result = new String(decoded);
// platform-dependent — may corrupt multi-byte characters
byte[] decoded = Base64.getDecoder().decode(encoded);
String result = new String(decoded, StandardCharsets.UTF_8);
// consistent across all platforms
ট্রেইলিং হোয়াইটস্পেস সহ স্ট্রিং ডিকোড করা

সমস্যা: টার্মিনাল থেকে পেস্ট করা বা কনফিগ ফাইল থেকে পড়া Base64 স্ট্রিংয়ে প্রায়ই ট্রেইলিং নিউলাইন থাকে। বেসিক ডিকোডার Base64 অ্যালফাবেটের বাইরে যেকোনো ক্যারেক্টার প্রত্যাখ্যান করে।

সমাধান: ডিকোড করার আগে ইনপুটে .strip() কল করুন, বা getMimeDecoder() তে সুইচ করুন যা হোয়াইটস্পেস উপেক্ষা করে।

Before · Java
After · Java
// Read from environment variable — has a trailing newline
String encoded = System.getenv("DB_PASSWORD_B64"); // "cG9zdGdyZXM=
"
byte[] decoded = Base64.getDecoder().decode(encoded);
// IllegalArgumentException: Illegal base64 character a
String encoded = System.getenv("DB_PASSWORD_B64");
byte[] decoded = Base64.getDecoder().decode(encoded.strip());
System.out.println(new String(decoded, StandardCharsets.UTF_8));
// postgres
বাইনারি ডেটাকে String এ রূপান্তর করা

সমস্যা: বাইনারি কন্টেন্টে (ছবি, protobuf, এনক্রিপ্টেড ব্লব) new String(decoded) কল করলে একটি অবৈধ String তৈরি হয়। পরে এটিকে বাইটে ফিরিয়ে রূপান্তর নীরবে ডেটা নষ্ট করে কারণ String কনস্ট্রাক্টর অবৈধ UTF-8 সিকোয়েন্স প্রতিস্থাপন করে।

সমাধান: আপনার পুরো পাইপলাইন জুড়ে বাইনারি ডেটা byte[] হিসেবে রাখুন। শুধুমাত্র তখনই String এ রূপান্তর করুন যখন আপনি জানেন কন্টেন্ট টেক্সট।

Before · Java
After · Java
byte[] decoded = Base64.getDecoder().decode(pngBase64);
String imageStr = new String(decoded); // corrupts binary
Files.writeString(Path.of("image.png"), imageStr); // broken file
byte[] decoded = Base64.getDecoder().decode(pngBase64);
// Write bytes directly — no String conversion
Files.write(Path.of("image.png"), decoded);

মেথড তুলনা

বিল্ট-ইন ডিকোডারগুলো বেশিরভাগ ব্যবহারের ক্ষেত্রে কভার করে। Apache Commons Codec এবং Guava হল বিকল্প যা আপনি পুরনো কোডবেসে দেখতে পারেন।

মেথড
এনকোডিং ভ্যারিয়েন্ট
হোয়াইটস্পেস উপেক্ষা করে
স্ট্রিমিং
কাস্টম টাইপ
ইনস্টল প্রয়োজন
Base64.getDecoder()
Standard (+, /)
না (JDK 8+)
Base64.getUrlDecoder()
URL-safe (-, _)
না (JDK 8+)
Base64.getMimeDecoder()
MIME (line breaks OK)
না (JDK 8+)
decoder.wrap(InputStream)
যেকোনো ভ্যারিয়েন্ট
ডিকোডারের উপর নির্ভর করে
না (JDK 8+)
Apache Commons Base64InputStream
Standard / URL-safe
হ্যাঁ (commons-codec)
Apache Commons Base64.decodeBase64()
Standard
হ্যাঁ (commons-codec)
Guava BaseEncoding.base64().decode()
Standard
হ্যাঁ (guava)

JWT টোকেন এবং আধুনিক API পেলোডের জন্য: getUrlDecoder()। ইমেইল অ্যাটাচমেন্ট এবং PEM সার্টিফিকেটের জন্য: getMimeDecoder()। বড় ফাইলের জন্য যেখানে মেমোরি গুরুত্বপূর্ণ: decoder.wrap(InputStream)। বাকি সব: getDecoder()। Apache Commons Codec শুধুমাত্র তখনই অর্থপূর্ণ যদি এটি ইতিমধ্যে আপনার ডিপেন্ডেন্সি ট্রিতে থাকে।

ডেভেলপমেন্টের সময় দ্রুত যাচাইকরণের জন্য, অনলাইন Base64 ডিকোডার একবার-ব্যবহারের ক্লাস লেখার চেয়ে দ্রুত।

প্রায়শই জিজ্ঞাসিত প্রশ্ন

Java তে Base64 স্ট্রিং কীভাবে ডিকোড করব?

java.util.Base64 ইম্পোর্ট করুন এবং Base64.getDecoder().decode(encodedString) কল করুন। এটি byte[] রিটার্ন করে — পাঠযোগ্য টেক্সট পেতে new String(bytes, StandardCharsets.UTF_8) দিয়ে র‍্যাপ করুন। URL-safe Base64 এর জন্য (JWT-তে ব্যবহৃত হয়), getDecoder() এর বদলে getUrlDecoder() ব্যবহার করুন।

Java 8+
import java.util.Base64;
import java.nio.charset.StandardCharsets;

byte[] decoded = Base64.getDecoder().decode("c2VydmVyLWNvbmZpZw==");
String result = new String(decoded, StandardCharsets.UTF_8);
System.out.println(result); // server-config

Java তে getDecoder() এবং getMimeDecoder() এর মধ্যে পার্থক্য কী?

getDecoder() কঠোর — লাইন ব্রেক সহ Base64 অ্যালফাবেটের বাইরে যেকোনো ক্যারেক্টার প্রত্যাখ্যান করে। getMimeDecoder() লাইন সেপারেটর (\r\n) সহনশীল এবং যেকোনো নন-Base64 ক্যারেক্টার উপেক্ষা করে, তাই ইমেইল অ্যাটাচমেন্ট এবং PEM সার্টিফিকেট ডিকোড করার জন্য এটি সঠিক পছন্দ যেখানে ডেটা ৭৬ ক্যারেক্টারে লাইন-র‍্যাপড থাকে।

Java 8+
String wrapped = "c2VydmVyLWNv\r\nbmZpZw==";

// getDecoder() throws IllegalArgumentException
// Base64.getDecoder().decode(wrapped); // FAILS

// getMimeDecoder() handles it
byte[] decoded = Base64.getMimeDecoder().decode(wrapped);
System.out.println(new String(decoded)); // server-config

Java তে Base64 URL-safe স্ট্রিং কীভাবে ডিকোড করব?

Base64.getUrlDecoder().decode(encoded) ব্যবহার করুন। URL ডিকোডার + এবং / এর পরিবর্তে RFC 4648 §5-এ সংজ্ঞায়িত - এবং _ অ্যালফাবেট প্রত্যাশা করে। JWT টোকেন সবসময় এই অ্যালফাবেট ব্যবহার করে। প্যাডিং ক্যারেক্টার (=) যদি বাদ দেওয়া হয় (JWT-তে সাধারণ), তবুও URL ডিকোডার এটি পরিচালনা করে — Java-র URL ডিকোডার প্যাডেড এবং আনপ্যাডেড উভয় ইনপুট গ্রহণ করে।

Java 8+
import java.util.Base64;

// JWT header — URL-safe, no padding
String jwtHeader = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9";
byte[] decoded = Base64.getUrlDecoder().decode(jwtHeader);
System.out.println(new String(decoded));
// {"alg":"HS256","typ":"JWT"}

Java তে একটি বড় Base64 ফাইল স্ট্রিম-ডিকোড কীভাবে করব?

FileInputStream র‍্যাপ করতে decoder.wrap(inputStream) ব্যবহার করুন। রিটার্ন করা InputStream বাইট পড়ার সময় রানটাইমে Base64 ডিকোড করে, তাই ফাইলের আকার নির্বিশেষে মেমোরি ব্যবহার স্থিতিশীল থাকে। সেরা থ্রুপুটের জন্য BufferedInputStream এর মাধ্যমে পাইপ করুন বা সরাসরি Files.copy() তে দিন।

Java 8+
import java.util.Base64;
import java.io.*;
import java.nio.file.*;

try (InputStream in = Base64.getDecoder().wrap(
        new BufferedInputStream(new FileInputStream("payload.b64")));
     OutputStream out = new FileOutputStream("payload.bin")) {
    in.transferTo(out);
}

কেন Base64.getDecoder().decode() IllegalArgumentException থ্রো করে?

বেসিক ডিকোডার কঠোর: এটি লাইন ব্রেক, স্পেস এবং A-Za-z0-9+/= এর বাইরে যেকোনো ক্যারেক্টার প্রত্যাখ্যান করে। তিনটি সাধারণ কারণ: ইনপুটে ট্রেইলিং নিউলাইন আছে (trim করুন), ইনপুট URL-safe ক্যারেক্টার যেমন - এবং _ ব্যবহার করে (getUrlDecoder() তে সুইচ করুন), বা ইনপুট ৭৬ ক্যারেক্টারে লাইন-র‍্যাপড (getMimeDecoder() তে সুইচ করুন)। এরর মেসেজ অস্পষ্ট হলে সবসময় raw bytes পরীক্ষা করুন।

Java 8+
String raw = "c2VydmVyLWNvbmZpZw==\n"; // trailing newline

// Option 1: trim whitespace
byte[] decoded = Base64.getDecoder().decode(raw.strip());

// Option 2: use MIME decoder which ignores whitespace
byte[] decoded2 = Base64.getMimeDecoder().decode(raw);

java.util.Base64 ছাড়া কি Java তে Base64 ডিকোড করা সম্ভব?

হ্যাঁ, কিন্তু Java 8+ এ এটি করার কোনো ভালো কারণ নেই। Java 8 এর আগে, ডেভেলপাররা sun.misc.BASE64Decoder (অভ্যন্তরীণ, Java 9+ এ সরানো হয়েছে), javax.xml.bind.DatatypeConverter.parseBase64Binary() (Java 11-এ সরানো হয়েছে), বা Apache Commons Codec ব্যবহার করতেন। তিনটিই হয় deprecated অথবা অতিরিক্ত ডিপেন্ডেন্সি প্রয়োজন। java.util.Base64 ব্যবহার করুন — এটি দ্রুত, JDK এর সাথে শিপ হয়, এবং তিনটি ভ্যারিয়েন্টই কভার করে (basic, URL-safe, MIME)।

সম্পর্কিত টুল

  • Base64 Encoder — ব্রাউজারে টেক্সট বা বাইনারি ডেটা Base64 এ এনকোড করুন, Java ইউনিট টেস্টে পেস্ট করার জন্য টেস্ট ফিক্সচার তৈরিতে সহায়ক।
  • JWT Decoder — তিনটি JWT সেগমেন্ট একসাথে স্প্লিট এবং ডিকোড করুন, ফিল্ড-বাই-ফিল্ড পেলোড ইন্সপেকশন সহ — শুধু একটি টোকেন পড়তে হলে Java ক্লাস লেখার চেয়ে দ্রুত।
  • URL Decoder — URL-এনকোডেড স্ট্রিং percent-ডিকোড করুন, API রেসপন্স Base64url ডেটার সাথে percent-encoded কোয়েরি প্যারামিটার মিশিয়ে থাকলে উপকারী।
  • JSON Formatter — Base64 JWT পেলোড বা API কনফিগ ডিকোড করার পর, JSON এখানে পেস্ট করুন pretty-print এবং স্ট্রাকচার যাচাই করতে।
এছাড়াও পাওয়া যায়:GoC#
PN
Pavel NovakBackend Engineer

Pavel is a backend engineer with deep roots in the JVM ecosystem, working primarily with Java and Kotlin. He has extensive experience building data-intensive services and integrating third-party APIs at scale. He writes about modern Java features, the Jackson ecosystem, serialisation patterns, and practical approaches to keeping large codebases maintainable.

AO
Aisha Oseiপ্রযুক্তিগত পর্যালোচক

Aisha is a Java engineer specialising in application security, Spring Security, and API design. She has worked on identity and access management systems, OAuth 2.0 integrations, and microservice security at scale. She writes about secure Java coding practices, token validation, cryptographic utilities, and the Spring ecosystem from a security-first perspective.