Java में Base64 Encode — java.util.Base64 उदाहरण

·Java Security & API Engineer·समीक्षकPavel Novak·प्रकाशित

मुफ़्त Base64 Encode Online को सीधे अपने ब्राउज़र में उपयोग करें — इंस्टॉलेशन की ज़रूरत नहीं।

Base64 Encode Online ऑनलाइन आज़माएं →

जब भी मैं HTTP Basic Auth header सेट करता हूँ, Kubernetes secret में प्रमाणपत्र एम्बेड करता हूँ, या JSON API के ज़रिए बाइनरी डेटा भेजता हूँ, पहला कदम हमेशा एक ही होता है: base64 एन्कोड करना — कच्चे बाइट्स को ASCII-सुरक्षित स्ट्रिंग में। Java इसे java.util.Base64 से सरल बनाता है, जो Java 8 से उपलब्ध मानक API है और अप्रचलित sun.misc.BASE64Encoder का विकल्प है। बिना कोड लिखे त्वरित एन्कोडिंग के लिए, ToolDeck का Base64 Encoder ब्राउज़र में तुरंत काम करता है। यह गाइड Base64.getEncoder(), getUrlEncoder(), getMimeEncoder(), फ़ाइल एन्कोडिंग, wrap(OutputStream) से स्ट्रीमिंग, और उन गलतियों को कवर करती है जो अनुभवी Java डेवलपर्स को भी ठोकर खिलाती हैं। सभी उदाहरण Java 8 से Java 21+ पर कम्पाइल होते हैं।

  • Base64.getEncoder().encodeToString(bytes) मानक एक-लाइनर है — Java 8 से JDK में अंतर्निर्मित, Java 17 और 21 तक अपरिवर्तित।
  • एन्कोडिंग से पहले हमेशा String.getBytes() में StandardCharsets.UTF_8 पास करें — इसे छोड़ने से प्लेटफ़ॉर्म डिफ़ॉल्ट का उपयोग होता है जो अलग-अलग JVM पर अलग होता है।
  • getUrlEncoder() URL-सुरक्षित आउटपुट देता है (+ की जगह -, / की जगह _) और withoutPadding() अंत के = वर्णों को हटाता है।
  • getMimeEncoder() हर 76 वर्णों पर नई लाइन डालता है — ईमेल (MIME) और PEM प्रमाणपत्र फ़ॉर्मैट के लिए आवश्यक।
  • बड़ी फ़ाइलों के लिए, पूरी फ़ाइल को मेमोरी में लोड किए बिना स्ट्रीम करने के लिए Base64.getEncoder().wrap(OutputStream) का उपयोग करें।

Base64 एन्कोडिंग क्या है?

Base64 मनमाने बाइनरी डेटा को 64 प्रिंट करने योग्य ASCII वर्णों से बनी स्ट्रिंग में कनवर्ट करता है: A-Z, a-z, 0-9, +, और /। इनपुट के हर 3 बाइट्स से ठीक 4 Base64 वर्ण बनते हैं। यदि इनपुट की लंबाई 3 का गुणज नहीं है, तो एक या दो = पैडिंग वर्ण जोड़े जाते हैं। एन्कोडेड आउटपुट हमेशा मूल डेटा से लगभग 33% बड़ा होता है।

Base64 एन्क्रिप्शन नहीं है। एन्कोडेड स्ट्रिंग वाला कोई भी व्यक्ति इसे डीकोड कर सकता है। इसका उद्देश्य ट्रांसपोर्ट सुरक्षा है: HTTP headers, JSON payloads, XML दस्तावेज़, और ईमेल बॉडी टेक्स्ट-आधारित प्रोटोकॉल हैं जो बिना करप्शन के कच्चे बाइनरी बाइट्स नहीं ले जा सकते। Java में सामान्य उपयोग के मामलों में HTTP Basic Authentication, PEM प्रमाणपत्र एम्बेड करना, डेटाबेस टेक्स्ट columns में बाइनरी डेटा संग्रहीत करना, और JWT टोकन सेगमेंट बनाना शामिल हैं।

Before · text
After · text
deploy-svc:sk_live_4eC39HqLyjWDarjtT1zdp7dc
ZGVwbG95LXN2Yzpza19saXZlXzRlQzM5SHFMeWpXRGFyanRUMXpkcDdkYw==

Base64.getEncoder().encodeToString() — मानक API

java.util.Base64 को Java 8 में sun.misc.BASE64Encoder के आधिकारिक विकल्प के रूप में पेश किया गया था। यह क्लास तीन static factory मेथड प्रदान करती है — प्रत्येक एक Base64.Encoder nested क्लास इंस्टेंस रिटर्न करती है — जो RFC 4648 में परिभाषित तीन Base64 वेरिएंट को कवर करती है। कोई तृतीय-पक्ष लाइब्रेरी आवश्यक नहीं। कोई Maven dependency नहीं। बस import करें और कॉल करें।

न्यूनतम उदाहरण — एक String एन्कोड करें

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

public class EncodeDemo {
    public static void main(String[] args) {
        String credentials = "monitoring-svc:9f2a7c4e-b1d8-4a3f";
        byte[] credentialBytes = credentials.getBytes(StandardCharsets.UTF_8);

        String encoded = Base64.getEncoder().encodeToString(credentialBytes);
        System.out.println(encoded);
        // bW9uaXRvcmluZy1zdmM6OWYyYTdjNGUtYjFkOC00YTNm
    }
}

वह मुख्य कदम जो अधिकांश Java डेवलपर्स पहली बार चूक जाते हैं: एन्कोडिंग से पहले एक String को byte[] में कनवर्ट करना होगा। Base64 बाइट्स पर काम करता है, वर्णों पर नहीं। encodeToString() एक byte[] स्वीकार करता है और सीधे Base64 String रिटर्न करता है। यदि आपको एन्कोडेड परिणाम बाइट्स के रूप में चाहिए, तो encode(byte[]) का उपयोग करें — यह ASCII-एन्कोडेड Base64 वर्णों का byte[] रिटर्न करता है, जो तब उपयोगी होता है जब आप सीधे OutputStream में लिख रहे हों या बाइनरी प्रोटोकॉल फ्रेम बना रहे हों।

HTTP Basic Auth — सबसे सामान्य उपयोग का मामला

HTTP Basic Authentication शायद वह सबसे सामान्य कारण है जिसके लिए Java डेवलपर्स Base64 एन्कोडिंग का सहारा लेते हैं। स्पेसिफिकेशन (RFC 7617) के अनुसार credentials स्ट्रिंग username:password को Base64-एन्कोड करके Authorization header में रखना होता है। मैंने यह गलत होते कई बार देखा है — आमतौर पर कोलन विभाजक भूलने या घटकों को अलग-अलग एन्कोड करने से।

Java — HTTP Basic Auth header
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.util.Base64;
import java.nio.charset.StandardCharsets;

public class BasicAuthExample {
    public static void main(String[] args) throws Exception {
        String username = "metrics-exporter";
        String apiKey = "sk_live_4eC39HqLyjWDarjtT1zdp7dc";

        // username:password → Base64
        String credentials = username + ":" + apiKey;
        String authHeader = "Basic " + Base64.getEncoder()
            .encodeToString(credentials.getBytes(StandardCharsets.UTF_8));

        HttpRequest request = HttpRequest.newBuilder()
            .uri(URI.create("https://api.example.com/v2/metrics"))
            .header("Authorization", authHeader)
            .build();

        HttpResponse<String> response = HttpClient.newHttpClient()
            .send(request, HttpResponse.BodyHandlers.ofString());

        System.out.println(response.statusCode());  // 200
    }
}

राउंड-ट्रिप — एन्कोड और डीकोड

Java 8+ — encode and decode round-trip
import java.util.Base64;
import java.nio.charset.StandardCharsets;

public class RoundTrip {
    public static void main(String[] args) {
        String original = "X-Correlation-ID: req_8a4f2c91-e7b3-4d56-9012-3f7a8b9c0d1e";

        // एन्कोड करें
        String encoded = Base64.getEncoder()
            .encodeToString(original.getBytes(StandardCharsets.UTF_8));
        System.out.println(encoded);
        // WC1Db3JyZWxhdGlvbi1JRDogcmVxXzhhNGYyYzkxLWU3YjMtNGQ1Ni05MDEyLTNmN2E4YjljMGQxZQ==

        // डीकोड करें
        byte[] decodedBytes = Base64.getDecoder().decode(encoded);
        String decoded = new String(decodedBytes, StandardCharsets.UTF_8);

        System.out.println(original.equals(decoded));  // true
    }
}
नोट:java.util.Base64 API Java 8 से Java 17 और Java 21 तक एक समान है। JDK अपग्रेड करते समय कोई माइग्रेशन आवश्यक नहीं है। वही कोड Java 8 के बाद किसी भी वर्शन पर कम्पाइल और रन होता है।

गैर-String डेटा एन्कोड करना — byte[], UUID, और Timestamps

Java में Base64 एन्कोडिंग हमेशा एक byte[] से शुरू होती है। Strings getBytes(StandardCharsets.UTF_8) के ज़रिए कनवर्ट होती हैं, लेकिन अन्य प्रकारों को पहले एक कनवर्शन कदम की ज़रूरत होती है। UUID, timestamps, और numeric identifiers को Base64-एन्कोड करने से पहले स्ट्रिंग या बाइट representation में क्रमबद्ध करना होगा।

UUID — String Representation के रूप में एन्कोड करें

Java — Base64 encoding a UUID
import java.util.Base64;
import java.util.UUID;
import java.nio.charset.StandardCharsets;

UUID sessionId = UUID.fromString("6ba7b810-9dad-11d1-80b4-00c04fd430c8");
String encoded = Base64.getEncoder()
    .encodeToString(sessionId.toString().getBytes(StandardCharsets.UTF_8));
System.out.println(encoded);
// NmJhN2I4MTAtOWRhZC0xMWQxLTgwYjQtMDBjMDRmZDQzMGM4

Compact UUID — कच्चे 16 बाइट्स एन्कोड करें

यदि आप छोटा एन्कोडेड परिणाम चाहते हैं, तो UUID को उसके 36-वर्ण स्ट्रिंग फ़ॉर्म में कनवर्ट करने के बजाय UUID के 128 bits को 16 कच्चे बाइट्स के रूप में निकालें। Base64 आउटपुट 48 वर्णों से घटकर 24 हो जाता है।

Java — compact UUID encoding
import java.nio.ByteBuffer;
import java.util.Base64;
import java.util.UUID;

UUID eventId = UUID.fromString("550e8400-e29b-41d4-a716-446655440000");

ByteBuffer buffer = ByteBuffer.wrap(new byte[16]);
buffer.putLong(eventId.getMostSignificantBits());
buffer.putLong(eventId.getLeastSignificantBits());

String compact = Base64.getUrlEncoder()
    .withoutPadding()
    .encodeToString(buffer.array());
System.out.println(compact);
// VQ6EAOKbQdSnFkRmVUQAAA
// 22 chars vs 48 for the string-based approach

Timestamp और मिश्रित Payload

Java — encoding a JSON-like payload with timestamp
import java.time.Instant;
import java.util.Base64;
import java.nio.charset.StandardCharsets;

// JWT-शैली का payload सिमुलेट करना
String payload = String.format(
    "{"sub":"usr_7b3c","iss":"auth.internal","iat":%d,"exp":%d}",
    Instant.now().getEpochSecond(),
    Instant.now().plusSeconds(3600).getEpochSecond()
);

String encoded = Base64.getUrlEncoder()
    .withoutPadding()
    .encodeToString(payload.getBytes(StandardCharsets.UTF_8));
System.out.println(encoded);
// eyJzdWIiOiJ1c3JfN2IzYyIsImlzcyI6ImF1dGguaW50ZXJuYWwiLCJpYXQiOj... (URL-safe, no padding)
चेतावनी:किसी byte[] पर उसकी सामग्री की उम्मीद के साथ toString() कॉल न करें — यह [B@6d06d69c जैसा array का identity hash देता है। new String(bytes, StandardCharsets.UTF_8) का उपयोग करें या बाइट array को सीधे encodeToString() में पास करें।

Base64.Encoder मेथड रेफरेंस

java.util.Base64 क्लास तीन factory मेथड उजागर करती है, प्रत्येक एक विशेष वेरिएंट के लिए कॉन्फ़िगर किया गया Base64.Encoder रिटर्न करती है। एन्कोडर इंस्टेंस थ्रेड-सुरक्षित और अवस्थाहीन हैं — एक बार बनाएँ और पुनः उपयोग करें।

मेथड
प्रकार
विवरण
getEncoder()
Base64.Encoder
मानक वर्णमाला (A-Z, a-z, 0-9, +, /) का उपयोग करते हुए एक बुनियादी RFC 4648 एन्कोडर रिटर्न करता है
getUrlEncoder()
Base64.Encoder
URL-सुरक्षित वर्णमाला (+ की जगह -, / की जगह _) का उपयोग करने वाला एन्कोडर रिटर्न करता है
getMimeEncoder()
Base64.Encoder
MIME एन्कोडर रिटर्न करता है जो हर 76 वर्णों पर \r\n नई लाइन डालता है
getMimeEncoder(lineLength, lineSeparator)
Base64.Encoder
कस्टम लाइन लंबाई और विभाजक बाइट्स के साथ MIME एन्कोडर
encoder.withoutPadding()
Base64.Encoder
ऐसा एन्कोडर रिटर्न करता है जो अंत के = पैडिंग वर्णों को हटा देता है
encoder.encode(byte[])
byte[]
बाइट array एन्कोड करता है, एन्कोडेड बाइट array रिटर्न करता है
encoder.encodeToString(byte[])
String
बाइट array एन्कोड करता है, सीधे एन्कोडेड String रिटर्न करता है
encoder.wrap(OutputStream)
OutputStream
Base64 स्ट्रीमिंग एन्कोडिंग के लिए एक OutputStream को रैप करता है

Base64.getUrlEncoder() — URL-सुरक्षित एन्कोडिंग

URL-सुरक्षित एन्कोडर एक वैकल्पिक वर्णमाला का उपयोग करता है जहाँ + बन जाता है - और / बन जाता है _, जैसा RFC 4648 सेक्शन 5 में परिभाषित है। यह तब महत्वपूर्ण होता है जब Base64 स्ट्रिंग URL query parameter, फ़ाइलनाम, या cookie मान में प्रकट होती है — मानक Base64 वर्ण URL सीमांकक और फ़ाइल सिस्टम के आरक्षित वर्णों से टकराते हैं।

Java — URL-safe Base64 encoding
import java.util.Base64;
import java.nio.charset.StandardCharsets;

String redirectUri = "https://app.internal/callback?state=auth_pending&nonce=9f2a7c";
byte[] data = redirectUri.getBytes(StandardCharsets.UTF_8);

// मानक एन्कोडर — + और / शामिल हैं जो URL तोड़ते हैं
String standard = Base64.getEncoder().encodeToString(data);
System.out.println(standard);
// aHR0cHM6Ly9hcHAuaW50ZXJuYWwvY2FsbGJhY2s/c3RhdGU9YXV0aF9wZW5kaW5nJm5vbmNlPTlmMmE3Yw==

// URL-सुरक्षित एन्कोडर — query parameters और filenames के लिए सुरक्षित
String urlSafe = Base64.getUrlEncoder().encodeToString(data);
System.out.println(urlSafe);
// aHR0cHM6Ly9hcHAuaW50ZXJuYWwvY2FsbGJhY2s_c3RhdGU9YXV0aF9wZW5kaW5nJm5vbmNlPTlmMmE3Yw==

// पैडिंग के बिना URL-सुरक्षित — JWT और compact tokens के लिए
String noPadding = Base64.getUrlEncoder().withoutPadding().encodeToString(data);
System.out.println(noPadding);
// aHR0cHM6Ly9hcHAuaW50ZXJuYWwvY2FsbGJhY2s_c3RhdGU9YXV0aF9wZW5kaW5nJm5vbmNlPTlmMmE3Yw

withoutPadding() वेरिएंट अंत के = वर्णों को हटा देता है। JWT स्पेसिफिकेशन header और payload सेगमेंट के लिए पैडिंग के बिना URL-सुरक्षित Base64 की आवश्यकता रखती है, इसलिए JWT टोकन्स को मैन्युअल रूप से बनाते या संशोधित करते समय getUrlEncoder().withoutPadding() बिल्कुल सही कॉल है।

नोट:withoutPadding() मेथड एक नया एन्कोडर इंस्टेंस रिटर्न करता है — यह मूल को संशोधित नहीं करता। दोनों को static final फ़ील्ड में असाइन किया जा सकता है और थ्रेड्स में सुरक्षित रूप से पुनः उपयोग किया जा सकता है।

फ़ाइल और API प्रतिक्रिया से एन्कोड करें

Java में Base64 एन्कोडिंग के दो सबसे सामान्य वास्तविक परिदृश्य: डिस्क से बाइनरी फ़ाइल पढ़ना (प्रमाणपत्र, छवियाँ, कॉन्फ़िगरेशन बंडल) और HTTP प्रतिक्रिया से प्राप्त डेटा एन्कोड करना।

फ़ाइल को Base64 में एन्कोड करें

Java — encoding a file
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.Base64;

public class FileEncoder {
    public static void main(String[] args) {
        try {
            byte[] fileBytes = Files.readAllBytes(Path.of("certs/server.pem"));
            String encoded = Base64.getEncoder().encodeToString(fileBytes);

            System.out.printf("Original: %d bytes%n", fileBytes.length);
            System.out.printf("Encoded:  %d chars%n", encoded.length());

            // एन्कोडेड सामग्री को टेक्स्ट फ़ाइल में लिखें
            Files.writeString(
                Path.of("certs/server.pem.b64"),
                encoded
            );
        } catch (java.io.IOException e) {
            System.err.println("Failed to read file: " + e.getMessage());
        }
    }
}

API प्रतिक्रिया Body एन्कोड करें

Java 11+ — encoding an HTTP response
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.util.Base64;

public class ApiEncoder {
    public static void main(String[] args) {
        try {
            HttpClient client = HttpClient.newHttpClient();
            HttpRequest request = HttpRequest.newBuilder()
                .uri(URI.create("https://api.example.com/v2/reports/weekly.pdf"))
                .header("Authorization", "Bearer tok_8f2a9c3d")
                .build();

            HttpResponse<byte[]> response = client.send(
                request, HttpResponse.BodyHandlers.ofByteArray()
            );

            if (response.statusCode() == 200) {
                String encoded = Base64.getEncoder()
                    .encodeToString(response.body());
                System.out.printf("Encoded %d bytes → %d chars%n",
                    response.body().length, encoded.length());
            } else {
                System.err.printf("HTTP %d: %s%n",
                    response.statusCode(),
                    new String(response.body()));
            }
        } catch (Exception e) {
            System.err.println("Request failed: " + e.getMessage());
        }
    }
}

CLI सेक्शन से पहले एक त्वरित नोट: यदि आपको बस एक फ़ाइल या API प्रतिक्रिया चिपकानी है और बिना कोड लिखे Base64 आउटपुट चाहिए, तो ऑनलाइन Base64 Encoder टेक्स्ट और बाइनरी दोनों इनपुट को हैंडल करता है।

Command-Line Base64 एन्कोडिंग

कभी-कभी आपको बस टर्मिनल से एक स्ट्रिंग या फ़ाइल एन्कोड करनी होती है — कोई Java प्रोजेक्ट नहीं, कोई IDE नहीं, कोई build step नहीं। अधिकांश Unix सिस्टम में एक base64 कमांड होती है, और यदि JDK इंस्टॉल है, तो Java-native दृष्टिकोण के लिए jshell का उपयोग कर सकते हैं।

Bash — command-line Base64 encoding
# macOS / Linux — एक string एन्कोड करें
echo -n "deploy-bot:sk_prod_9f2a7c4e" | base64
# ZGVwbG95LWJvdDpza19wcm9kXzlmMmE3YzRl

# एक फ़ाइल एन्कोड करें
base64 < certs/server.pem > certs/server.pem.b64

# jshell का उपयोग (JDK 9+)
echo 'System.out.println(java.util.Base64.getEncoder().encodeToString("deploy-bot:sk_prod_9f2a7c4e".getBytes()))' | jshell -

# java को सीधे एक-लाइनर के साथ उपयोग करें
java -e 'System.out.println(java.util.Base64.getEncoder().encodeToString(args[0].getBytes()))' "my-secret"
# नोट: java -e के लिए JDK 23+ (JEP 477) आवश्यक है

jshell दृष्टिकोण तब विशेष रूप से उपयोगी होता है जब आपको यह सत्यापित करना हो कि आपका Java कोड Unix टूल के समान आउटपुट देता है, या जब आप यह डीबग कर रहे हों कि आपकी सर्विस क्या भेजती है और रिसीवर क्या अपेक्षा रखता है उसके बीच कोई मेल नहीं है। मैं इसके लिए एक shell alias रखता हूँ।

नोट:macOS पर, base64 कमांड डीकोडिंग के लिए -D का उपयोग करती है। Linux (GNU coreutils) पर यह -d का उपयोग करती है। दोनों पर एन्कोडिंग व्यवहार एक समान है। Linux पर -w 0 फ़्लैग आउटपुट में नई लाइन रैपिंग को बंद करता है, जो आमतौर पर तब उपयोगी होता है जब आप अन्य कमांड्स में pipe कर रहे हों।

Apache Commons Codec — उच्च-प्रदर्शन विकल्प

अधिकांश अनुप्रयोगों के लिए, java.util.Base64 पर्याप्त तेज़ है। लेकिन यदि आप एक सघन लूप में लाखों एन्कोडिंग ऑपरेशन संसाधित कर रहे हैं — जैसे लॉग इंजेशन पाइपलाइन या उच्च-थ्रूपुट मैसेज ब्रोकर — Apache Commons Codec को बेंचमार्क करना उचित है। यह Java 8 से बहुत पहले से उपलब्ध है और थोड़े अलग API surface के साथ एक परीक्षित विकल्प प्रदान करता है।

Java — Apache Commons Codec
// Maven: org.apache.commons:commons-codec:1.17.0
import org.apache.commons.codec.binary.Base64;
import java.nio.charset.StandardCharsets;

byte[] telemetryPayload = ("{"service":"metrics-collector","
    + ""host":"prod-east-07","
    + ""cpu_pct":72.4,"
    + ""mem_mb":3891,"
    + ""timestamp":1710523200}")
    .getBytes(StandardCharsets.UTF_8);

// मानक एन्कोडिंग
String encoded = Base64.encodeBase64String(telemetryPayload);

// URL-सुरक्षित एन्कोडिंग
String urlSafe = Base64.encodeBase64URLSafeString(telemetryPayload);

// जाँचें कि स्ट्रिंग वैध Base64 है
boolean valid = Base64.isBase64(encoded);
System.out.println(valid);  // true

Apache Commons Codec स्ट्रीमिंग परिदृश्यों के लिए Base64OutputStream और Base64InputStream भी प्रदान करता है, और एक सत्यापन मेथड शामिल है जो JDK एन्कोडर में नहीं है। यदि Commons Codec पहले से आपके dependency tree में है (यह कई Apache प्रोजेक्ट्स के साथ आता है), तो इसका उपयोग करने का कोई कारण नहीं कि न करें।

Guava BaseEncoding

Google की Guava लाइब्रेरी में BaseEncoding शामिल है जो कॉन्फ़िगर करने योग्य नई लाइन विभाजक, पैडिंग नियंत्रण, और मानक तथा URL-सुरक्षित दोनों वर्णमालाओं के समर्थन के साथ Base64 के लिए एक सरल श्रृंखलाबद्ध API प्रदान करता है। केवल Base64 एन्कोडिंग के लिए Guava (लगभग 3 MB) जोड़ना अनुचित है। यदि Guava पहले से आपके प्रोजेक्ट में संग्रह या कैशिंग उपयोगिताओं के लिए है, तो एन्कोडिंग API एक अच्छा अतिरिक्त लाभ है।

Java — Guava BaseEncoding
// Maven: com.google.guava:guava:33.1.0-jre
import com.google.common.io.BaseEncoding;
import java.nio.charset.StandardCharsets;

byte[] webhookPayload = ("{"event":"deployment.completed","
    + ""repo":"payments-api","
    + ""sha":"a7f2c91e4b3d","
    + ""environment":"production"}")
    .getBytes(StandardCharsets.UTF_8);

// मानक Base64
String standard = BaseEncoding.base64().encode(webhookPayload);

// URL-सुरक्षित
String urlSafe = BaseEncoding.base64Url().encode(webhookPayload);

// पैडिंग के बिना
String noPad = BaseEncoding.base64Url().omitPadding().encode(webhookPayload);

// नई लाइन विभाजक के साथ (PEM-शैली)
String wrapped = BaseEncoding.base64()
    .withSeparator("\n", 64)
    .encode(webhookPayload);

Base64.getMimeEncoder() — MIME और PEM लाइन-रैप्ड आउटपुट

MIME एन्कोडर हर 76 वर्णों पर \r\n नई लाइन डालता है, जो MIME स्पेसिफिकेशन (RFC 2045) से मेल खाता है। PEM प्रमाणपत्र, S/MIME ईमेल attachments, और कुछ पुराने APIs इस फ़ॉर्मैट की अपेक्षा रखते हैं। मानक और URL-सुरक्षित एन्कोडर एक बिना खंडित लाइन देते हैं — यदि आप उनका आउटपुट किसी ऐसे सिस्टम को पास करते हैं जो लाइन-रैप्ड Base64 की उम्मीद रखता है, तो वह चुपचाप विफल हो सकता है या डेटा अस्वीकार कर सकता है।

Java — MIME Base64 encoding
import java.util.Base64;
import java.nio.charset.StandardCharsets;

// PEM certificate body सिमुलेट करें
byte[] certData = new byte[256];  // व्यवहार में .der फ़ाइल से पढ़ें
new java.security.SecureRandom().nextBytes(certData);

// डिफ़ॉल्ट MIME एन्कोडर — 76 वर्ण प्रति लाइन, \r\n विभाजक
String mimeEncoded = Base64.getMimeEncoder().encodeToString(certData);
System.out.println(mimeEncoded);
// QYx2K3p8Xg7JmN1R+wFkLd...  (76 chars)
// Ht5Bv9CzAq0PnSjYl8WxUe...  (76 chars)
// ...

// कस्टम MIME एन्कोडर — 64 वर्ण प्रति लाइन (PEM मानक), \n विभाजक
Base64.Encoder pemEncoder = Base64.getMimeEncoder(64, new byte[]{'\n'});
String pemBody = pemEncoder.encodeToString(certData);
System.out.println("-----BEGIN CERTIFICATE-----");
System.out.println(pemBody);
System.out.println("-----END CERTIFICATE-----");
चेतावनी:JWT टोकन्स, HTTP headers, या URL parameters के लिए getMimeEncoder() का उपयोग न करें। नई लाइनें उन संदर्भों में डेटा को करप्ट कर देंगी। इसके बजाय getEncoder() या getUrlEncoder() का उपयोग करें।

Base64.getEncoder().wrap() से बड़ी फ़ाइलें स्ट्रीम करें

Files.readAllBytes() से पूरी फ़ाइल को एक byte[] में लोड करना छोटी फ़ाइलों के लिए काम करता है, लेकिन 50-100 MB से अधिक के लिए OutOfMemoryError का जोखिम होता है। JDK Base64.getEncoder().wrap(OutputStream) प्रदान करता है, जो एक ऐसा OutputStream रिटर्न करता है जो लिखते समय डेटा को तुरंत एन्कोड करता है। एन्कोडेड बाइट्स पूरे इनपुट को बफ़र किए बिना अंतर्निहित स्ट्रीम में प्रवाहित होती हैं।

Java — streaming Base64 encoding
import java.io.*;
import java.nio.file.*;
import java.util.Base64;

public class StreamingEncoder {
    public static void main(String[] args) throws IOException {
        Path inputPath = Path.of("backups/database-export.sql.gz");
        Path outputPath = Path.of("backups/database-export.sql.gz.b64");

        try (
            InputStream in = Files.newInputStream(inputPath);
            OutputStream fileOut = Files.newOutputStream(outputPath);
            OutputStream base64Out = Base64.getEncoder().wrap(fileOut)
        ) {
            byte[] buffer = new byte[8192];
            int bytesRead;
            long totalBytes = 0;

            while ((bytesRead = in.read(buffer)) != -1) {
                base64Out.write(buffer, 0, bytesRead);
                totalBytes += bytesRead;
            }

            System.out.printf("Streamed %d bytes through Base64 encoder%n", totalBytes);
        }
        // base64Out बंद करने पर अंतिम पैडिंग बाइट्स स्वचालित रूप से flush होती हैं
    }
}

try-with-resources ब्लॉक flushing और closing को हैंडल करता है। एक विवरण जो लोगों को अचानक पकड़ता है: अंतिम Base64 पैडिंग तभी लिखी जाती है जब रैपिंग OutputStream बंद होती है। यदि आप इसे बंद करना भूल जाते हैं (या केवल बाहरी स्ट्रीम बंद करते हैं), तो आपके एन्कोडेड आउटपुट के अंतिम कुछ वर्ण अनुपस्थित हो सकते हैं।

नेटवर्क सॉकेट पर स्ट्रीमिंग

wrap() मेथड किसी भी OutputStream के साथ काम करता है — फ़ाइल आउटपुट, सॉकेट आउटपुट, HTTP प्रतिक्रिया body, यहाँ तक कि ByteArrayOutputStream। यहाँ Base64-एन्कोडेड डेटा सीधे इन-मेमोरी बफ़र में लिखने का उदाहरण है, जो इकाई परीक्षण या HTTP पर भेजे जाने वाले पेलोड बनाने के लिए उपयोगी है:

Java — streaming to ByteArrayOutputStream
import java.io.ByteArrayOutputStream;
import java.io.OutputStream;
import java.util.Base64;
import java.nio.charset.StandardCharsets;

ByteArrayOutputStream buffer = new ByteArrayOutputStream();

try (OutputStream encoder = Base64.getEncoder().wrap(buffer)) {
    // डेटा को खंडों में लिखें — स्ट्रीम से पढ़ने का सिमुलेशन
    encoder.write("chunk-1:telemetry-data-".getBytes(StandardCharsets.UTF_8));
    encoder.write("chunk-2:more-payload-".getBytes(StandardCharsets.UTF_8));
    encoder.write("chunk-3:final-segment".getBytes(StandardCharsets.UTF_8));
}

String encoded = buffer.toString(StandardCharsets.UTF_8);
System.out.println(encoded);
// Y2h1bmstMTp0ZWxlbWV0cnktZGF0YS1jaHVuay0yOm1vcmUtcGF5bG9hZC1jaHVuay0zOmZpbmFsLXNlZ21lbnQ=

// राउंड-ट्रिप सत्यापित करें
byte[] decoded = Base64.getDecoder().decode(encoded);
System.out.println(new String(decoded, StandardCharsets.UTF_8));
// chunk-1:telemetry-data-chunk-2:more-payload-chunk-3:final-segment
नोट:स्ट्रीमिंग उदाहरण में बफ़र आकार (8192 बाइट्स) मनमाना नहीं है। यह BufferedInputStream द्वारा उपयोग किए जाने वाले डिफ़ॉल्ट बफ़र आकार से मेल खाता है और मेमोरी उपयोग तथा सिस्टम कॉल ओवरहेड के बीच एक अच्छा संतुलन है। छोटे बफ़र read/write कॉल की संख्या बढ़ाते हैं; बड़े बफ़र उल्लेखनीय थ्रूपुट सुधार के बिना मेमोरी बर्बाद करते हैं।

थ्रेड-सुरक्षित एन्कोडर इंस्टेंस — संग्रहीत करें और पुनः उपयोग करें

factory मेथड द्वारा रिटर्न किया गया Base64.Encoder अपरिवर्तनीय और थ्रेड-सुरक्षित है। हर एन्कोडिंग ऑपरेशन पर Base64.getEncoder() कॉल करने से हर बार एक नया ऑब्जेक्ट बनता है। JVM इसे अनुकूलित कर सकता है, लेकिन एन्कोडर को एक static final फ़ील्ड में संग्रहीत करना उद्देश्य स्पष्ट करता है और महत्वपूर्ण पथों में अनावश्यक आवंटन से बचाता है।

Java — reusable encoder instances
import java.util.Base64;
import java.nio.charset.StandardCharsets;

public class TokenService {
    // एक बार बनाएँ, हर जगह पुनः उपयोग करें — थ्रेड-सुरक्षित
    private static final Base64.Encoder STANDARD = Base64.getEncoder();
    private static final Base64.Encoder URL_SAFE = Base64.getUrlEncoder().withoutPadding();
    private static final Base64.Encoder MIME = Base64.getMimeEncoder();

    public static String encodeForHeader(String value) {
        return STANDARD.encodeToString(value.getBytes(StandardCharsets.UTF_8));
    }

    public static String encodeForUrl(byte[] data) {
        return URL_SAFE.encodeToString(data);
    }

    public static String encodeForEmail(byte[] attachment) {
        return MIME.encodeToString(attachment);
    }
}

withoutPadding() कॉल एक नया एन्कोडर इंस्टेंस रिटर्न करता है, इसलिए आप padded और unpadded दोनों वेरिएंट को अलग-अलग फ़ील्ड के रूप में संग्रहीत कर सकते हैं। encodeToString() या encode() का प्रत्येक कॉल अवस्थाहीन है — कोई समन्वयन आवश्यक नहीं, कोई साझा परिवर्तनीय अवस्था नहीं।

सामान्य गलतियाँ

charset निर्दिष्ट किए बिना getBytes() कॉल करना

समस्या: बिना charset argument के String.getBytes() प्लेटफ़ॉर्म के डिफ़ॉल्ट एन्कोडिंग का उपयोग करता है, जो Windows पर windows-1252, अधिकांश Linux सिस्टम पर UTF-8, और macOS पर अलग-अलग होती है। एक ही कोड अलग-अलग मशीनों पर अलग-अलग Base64 आउटपुट देता है।

समाधान: हमेशा StandardCharsets.UTF_8 स्पष्ट रूप से पास करें।

Before · Java
After · Java
String text = "Ключ доступа: prod-east";
byte[] bytes = text.getBytes();  // platform default — unpredictable
String encoded = Base64.getEncoder().encodeToString(bytes);
String text = "Ключ доступа: prod-east";
byte[] bytes = text.getBytes(StandardCharsets.UTF_8);
String encoded = Base64.getEncoder().encodeToString(bytes);
URL parameters के लिए मानक एन्कोडर का उपयोग करना

समस्या: Base64.getEncoder() + और / वर्ण आउटपुट करता है। URL query string में रखे जाने पर, + को रिक्त स्थान के रूप में और / को path सीमांकक के रूप में व्याख्यायित किया जाता है, जो प्राप्तकर्ता पर मान को चुपचाप दूषित कर देता है।

समाधान: URL में दिखने वाले किसी भी मान के लिए Base64.getUrlEncoder() का उपयोग करें।

Before · Java
After · Java
// URL query parameter में टोकन — टूट जाएगा
String token = Base64.getEncoder()
    .encodeToString(sessionData);
String url = "https://auth.internal/verify?token=" + token;
// URL-सुरक्षित एन्कोडिंग — कोई + या / वर्ण नहीं
String token = Base64.getUrlEncoder()
    .withoutPadding()
    .encodeToString(sessionData);
String url = "https://auth.internal/verify?token=" + token;
गलत एन्कोडर वेरिएंट से डीकोड करना

समस्या: getUrlEncoder() से एन्कोड करना और getDecoder() से डीकोड करना (या उलटा) IllegalArgumentException फेंकता है क्योंकि - और _ मानक Base64 वर्णमाला में वैध नहीं हैं, और + और / URL-सुरक्षित वर्णमाला में वैध नहीं हैं।

समाधान: हमेशा संगत decoder से डीकोड करें: URL-सुरक्षित के लिए getUrlDecoder(), मानक के लिए getDecoder()।

Before · Java
After · Java
String encoded = Base64.getUrlEncoder()
    .encodeToString(data);
// बाद में...
byte[] decoded = Base64.getDecoder()  // गलत decoder
    .decode(encoded);
// IllegalArgumentException यदि encoded में - या _ हो
String encoded = Base64.getUrlEncoder()
    .encodeToString(data);
// बाद में...
byte[] decoded = Base64.getUrlDecoder()  // matching decoder
    .decode(encoded);
wrap() OutputStream बंद न करना

समस्या: स्ट्रीमिंग एन्कोडर पूरे 3-बाइट समूह की प्रतीक्षा करते हुए 2 इनपुट बाइट्स तक बफ़र करता है। यदि आप रैपिंग OutputStream बंद नहीं करते, तो अंतिम 1-4 Base64 वर्ण (पैडिंग सहित) कभी नहीं लिखे जाते।

समाधान: try-with-resources का उपयोग करें, या आउटपुट पढ़ने से पहले wrapped स्ट्रीम पर close() स्पष्ट रूप से कॉल करें।

Before · Java
After · Java
ByteArrayOutputStream baos = new ByteArrayOutputStream();
OutputStream b64os = Base64.getEncoder().wrap(baos);
b64os.write(data);
// baos.toString() अधूरा है — अंतिम बाइट्स गायब हैं
ByteArrayOutputStream baos = new ByteArrayOutputStream();
try (OutputStream b64os = Base64.getEncoder().wrap(baos)) {
    b64os.write(data);
}  // close() अंतिम पैडिंग flush करता है
String encoded = baos.toString();  // complete

Base64 एन्कोडिंग मेथड — तुलना

मेथड
URL-सुरक्षित
स्ट्रीमिंग
नई लाइन
कस्टम प्रकार
इंस्टॉल आवश्यक
Base64.getEncoder()
✓ (wrap)
नहीं (JDK 8+)
Base64.getUrlEncoder()
✓ (wrap)
नहीं (JDK 8+)
Base64.getMimeEncoder()
✓ (wrap)
✓ (76 वर्ण)
नहीं (JDK 8+)
Apache Commons Codec
Maven dependency
Guava BaseEncoding
✓ (कॉन्फ़िगर करने योग्य)
Maven dependency
jcmd / CLI base64
✓ (pipe)
N/A
System install

अधिकांश प्रोजेक्ट्स के लिए: java.util.Base64 सही विकल्प है। शून्य dependencies, JDK में अंतर्निर्मित, थ्रेड-सुरक्षित, और सभी तीन RFC 4648 वेरिएंट कवर करता है। Apache Commons Codec का सहारा केवल तब लें जब यह पहले से आपके classpath में हो और आपको isBase64() validation मेथड या स्ट्रीमिंग Base64OutputStream चाहिए। Guava का BaseEncoding एक उचित विकल्प है यदि आपका प्रोजेक्ट पहले से Guava पर निर्भर है, लेकिन केवल Base64 के लिए 3 MB dependency जोड़ना उचित ठहराना कठिन है।

तीन परिदृश्य, तीन विकल्प: मानक web service जिसे Basic Auth या JWT एन्कोडिंग चाहिए? JDK के साथ रहें। पुराना प्रोजेक्ट जो Spring या Apache HTTP Client के ज़रिए Commons Codec पहले से खींच रहा है? इसका उपयोग करें — classpath पर दो Base64 लाइब्रेरी रखने का कोई कारण नहीं। कैशिंग और संग्रह के लिए Guava का उपयोग करने वाला प्रोजेक्ट? इसके सुव्यवस्थित API के लिए BaseEncoding का उपयोग करें। केवल Base64 एन्कोडिंग के लिए कोई लाइब्रेरी कभी न जोड़ें — JDK वर्शन 2014 से पर्याप्त अच्छा है।

यदि आपको अपना Java कोड चलाए बिना एन्कोडेड परिणाम शीघ्रता से सत्यापित करना हो, तो इसे Base64 Encoder में चिपकाएँ और पुष्टि करें कि आउटपुट आपके कोड से मेल खाता है।

अक्सर पूछे जाने वाले प्रश्न

Java में String को Base64 एन्कोड कैसे करें?

पहले getBytes(StandardCharsets.UTF_8) का उपयोग करके स्ट्रिंग को बाइट्स में कनवर्ट करें, फिर बाइट array को Base64.getEncoder().encodeToString() में पास करें। हमेशा UTF-8 स्पष्ट रूप से निर्दिष्ट करें — बिना charset argument के getBytes() कॉल करना प्लेटफ़ॉर्म डिफ़ॉल्ट का उपयोग करता है, जो ऑपरेटिंग सिस्टम और JVM कॉन्फ़िगरेशन के अनुसार अलग-अलग होता है।

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

String payload = "grant_type=client_credentials&scope=read:metrics";
String encoded = Base64.getEncoder()
    .encodeToString(payload.getBytes(StandardCharsets.UTF_8));
// Z3JhbnRfdHlwZT1jbGllbnRfY3JlZGVudGlhbHMmc2NvcGU9cmVhZDptZXRyaWNz

Base64.getEncoder() और Base64.getUrlEncoder() में क्या अंतर है?

दोनों Base64 में एन्कोड करते हैं, लेकिन getUrlEncoder() RFC 4648 सेक्शन 5 में परिभाषित URL-सुरक्षित वर्णमाला का उपयोग करता है। यह + को - से और / को _ से बदल देता है ताकि आउटपुट URL और फ़ाइलनामों में percent-encoding के बिना प्रकट हो सके। मानक एन्कोडर + और / का उपयोग करता है जो URL query parameters और path segments के साथ टकराते हैं।

Java
byte[] data = "subject=usr_7b3c&role=admin".getBytes(StandardCharsets.UTF_8);

String standard = Base64.getEncoder().encodeToString(data);
// c3ViamVjdD11c3JfN2IzYyZyb2xlPWFkbWlu

String urlSafe = Base64.getUrlEncoder().encodeToString(data);
// c3ViamVjdD11c3JfN2IzYyZyb2xlPWFkbWlu
// (same here, but with + → - and / → _ when those chars appear)

क्या java.util.Base64 Java 8 और Java 17 में एक समान है?

हाँ। java.util.Base64 API Java 8 में पेश होने के बाद से नहीं बदली है। क्लास, इसके nested Encoder और Decoder क्लासेस, और सभी factory मेथड (getEncoder, getUrlEncoder, getMimeEncoder) Java 8, 11, 17 और 21 में एक समान हैं। JDK वर्शन अपग्रेड करते समय कोई माइग्रेशन या कोड बदलाव आवश्यक नहीं है।

Java
// यह कोड Java 8 से Java 21+ तक एक समान कम्पाइल और रन होता है
import java.util.Base64;
import java.nio.charset.StandardCharsets;

String encoded = Base64.getEncoder()
    .encodeToString("stable-api".getBytes(StandardCharsets.UTF_8));
System.out.println(encoded);  // c3RhYmxlLWFwaQ==

Java में फ़ाइल को Base64 में एन्कोड कैसे करें?

Files.readAllBytes(Path) से फ़ाइल को बाइट array में पढ़ें और उसे Base64.getEncoder().encodeToString() में पास करें। बड़ी फ़ाइलों के लिए जिन्हें पूरी तरह मेमोरी में लोड नहीं करना चाहिए, एन्कोडेड आउटपुट को स्ट्रीम करने के लिए Base64.getEncoder().wrap(OutputStream) का उपयोग करें।

Java
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.Base64;

byte[] fileBytes = Files.readAllBytes(Path.of("config/tls-cert.pem"));
String encoded = Base64.getEncoder().encodeToString(fileBytes);

sun.misc.BASE64Encoder को अप्रचलित क्यों किया गया?

sun.misc.BASE64Encoder एक आंतरिक JDK क्लास था जो कभी public API का हिस्सा नहीं था। यह sun.misc package में था, जिसे Oracle ने उपयोग न करने की स्पष्ट चेतावनी दी थी। Java 8 ने java.util.Base64 को आधिकारिक, public, समर्थित विकल्प के रूप में पेश किया। Java 9 और मॉड्यूल सिस्टम के बाद से, sun.misc क्लासेस तक पहुँचने पर JDK कॉन्फ़िगरेशन के अनुसार चेतावनियाँ या त्रुटियाँ आती हैं।

Java
// पुराना तरीका — उपयोग न करें, आधुनिक JDK में हटा दिया गया है
// import sun.misc.BASE64Encoder;
// String encoded = new BASE64Encoder().encode(data);

// Java 8 से सही तरीका
import java.util.Base64;
String encoded = Base64.getEncoder().encodeToString(data);

Java में Base64 एन्कोड और डीकोड का राउंड-ट्रिप कैसे करें?

Base64.getEncoder().encodeToString(bytes) से एन्कोड करें और Base64.getDecoder().decode(encodedString) से डीकोड करें। डीकोड की गई बाइट array को new String(bytes, StandardCharsets.UTF_8) का उपयोग करके String में वापस कनवर्ट करें। राउंड-ट्रिप मूल डेटा को बिल्कुल सुरक्षित रखता है — जब तक आप getBytes() और new String() दोनों के लिए एक ही charset का उपयोग करते हैं।

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

// एन्कोड करें
String original = "session_token=eyJhbGciOiJSUzI1NiJ9";
byte[] originalBytes = original.getBytes(StandardCharsets.UTF_8);
String encoded = Base64.getEncoder().encodeToString(originalBytes);

// डीकोड करें
byte[] decodedBytes = Base64.getDecoder().decode(encoded);
String decoded = new String(decodedBytes, StandardCharsets.UTF_8);

System.out.println(original.equals(decoded));  // true

संबंधित टूल्स

  • Base64 डीकोडरBase64 स्ट्रिंग्स को उनके मूल टेक्स्ट या बाइनरी फ़ॉर्म में डीकोड करें — एन्कोडिंग की विपरीत प्रक्रिया।
  • URL एन्कोडरURL में सुरक्षित उपयोग के लिए स्ट्रिंग्स को percent-encode करें — Base64 URL-सुरक्षित एन्कोडिंग से अलग, लेकिन अक्सर इसके साथ उपयोग किया जाता है।
  • JWT डीकोडरJWT टोकन्स को इंस्पेक्ट करें जिनके header और payload सेगमेंट Base64url-एन्कोडेड JSON हैं — बिना किसी लाइब्रेरी के डीकोड करें।
  • JSON फ़ॉर्मैटरBase64 एन्कोडिंग से पहले या बाद में JSON payloads को pretty-print करें — API इंटीग्रेशन डीबग करते समय उपयोगी।
इसमें भी उपलब्ध:JavaScriptPython
AO
Aisha OseiJava Security & API Engineer

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.

PN
Pavel Novakतकनीकी समीक्षक

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.