कोई अपलोड नहीं, 100% स्थानीय, कोई खाता नहीं

लेख

डेटा को निजी रूप से एनकोड और डिकोड करें

डेवलपर हर दिन टोकन, पेलोड और क्रेडेंशियल को एनकोड और डिकोड करने वाले पेजों में पेस्ट करते हैं. सबसे सुविधाजनक पेज किसी सर्वर पर चलते हैं, यानी आपका डेटा एक ऐसे काम के लिए आपके डिवाइस से निकल जाता है जिसके लिए इसकी कभी ज़रूरत ही नहीं थी. ये चार टूल पूरी तरह आपके ब्राउज़र में चलते हैं, इसलिए डेटा आपके पास ही रहता है.

Base64: यह उलझा हुआ दिखता है, पर गुप्त नहीं है

Base64 एक एनकोडिंग है, एन्क्रिप्शन नहीं. यह बाइनरी डेटा को ऐसे टेक्स्ट में बदलता है जो कॉपी-पेस्ट या केवल साधारण अक्षर संभालने वाले सिस्टम से गुज़रने के बाद भी बचा रहता है. जो भी Base64 स्ट्रिंग देखता है वह उसे एक ही चरण में वापस मूल में डिकोड कर सकता है, इसलिए कोई स्ट्रिंग जिसमें API कुंजी, निजी प्रमाणपत्र या ईमेल का मुख्य भाग हो, उसे रखने वाले के लिए पूरी तरह पढ़ने योग्य होती है. खतरा यह है कि यह मान अक्सर कॉन्फ़िग फ़ाइलों, data URL या प्रमाणीकरण हेडर में छिपा रहता है और अस्पष्ट लगता है, जिससे लोग उसे ऑनलाइन मिले पहले डिकोडर में पेस्ट करने को ललचाते हैं. वह डिकोडर कच्चा रहस्य पा लेता है. Base64 को स्थानीय रूप से डिकोड करने वाला टूल आपको मूल बाइट दिखाता है और वह मान कभी किसी सर्वर तक नहीं पहुँचता.

Hello! को SGVsbG8h में एन्कोड करके वापस डीकोड किया गया, जो दिखाता है कि Base64 को बिना किसी कुंजी के कोई भी उलट सकता है।

URL एनकोडिंग: क्वेरी स्ट्रिंग आपकी सोच से ज़्यादा ले जाती है

प्रतिशत एनकोडिंग आपको स्पेस, उच्चारण चिह्न और आरक्षित अक्षर सुरक्षित रूप से किसी URL में रखने देती है. आप जो टेक्स्ट एनकोड या डिकोड करते हैं वह अक्सर किसी ऐप्लिकेशन की असली क्वेरी स्ट्रिंग होती है, और ये सत्र पहचानकर्ता, खोज शब्द, ईमेल पते, रीडायरेक्ट लक्ष्य और कभी-कभी हस्ताक्षरित पैरामीटर ले जाती हैं. किसी पूरे URL को दूरस्थ एनकोडर में पेस्ट करना यह सब एक ही बार में किसी तीसरे पक्ष को सौंप देता है, और क्वेरी स्ट्रिंग ठीक वही प्रकार का मान है जो सर्वर लॉग में जा पहुँचता है. ब्राउज़र में एनकोड और डिकोड करने का मतलब है कि URL आपके अपने डिवाइस की मेमोरी में संसाधित होता है और काम करते समय कभी प्रसारित नहीं होता.

JWT: पेलोड हस्ताक्षरित है, छिपा हुआ नहीं

एक JSON Web Token बिंदुओं से जुड़े तीन Base64url खंडों से बनता है: एक हेडर, एक पेलोड और एक हस्ताक्षर. हस्ताक्षर साबित करता है कि टोकन से छेड़छाड़ नहीं हुई, पर वह पेलोड को छिपाने के लिए कुछ नहीं करता, जो पढ़ने योग्य JSON में डिकोड होता है जिसमें उपयोगकर्ता पहचानकर्ता, भूमिकाएँ, समाप्ति समय और जारीकर्ता द्वारा जोड़े गए कोई भी कस्टम दावे होते हैं. एक मान्य टोकन एक जीवित क्रेडेंशियल भी है: समाप्त होने तक, जो भी इसे रखता है वह उपयोगकर्ता के रूप में काम कर सकता है. किसी चालू टोकन को ऑनलाइन डिकोडर में पेस्ट करना एक सक्रिय क्रेडेंशियल को ऐसे सर्वर पर भेज देता है जिसे आप नियंत्रित नहीं करते. आपके ब्राउज़र में टोकन को पार्स करने वाला डिकोडर वही हेडर और पेलोड दिखाता है, और वह टोकन कभी पेज से बाहर नहीं जाता.

एक JWT के तीन हिस्से: पढ़ने योग्य header, पढ़ने योग्य payload, और एक हस्ताक्षर जो कुछ भी छिपाए बिना अखंडता साबित करता है।

हैशिंग: इनपुट डाइजेस्ट से ज़्यादा मायने रखता है

एक हैश फ़ंक्शन किसी भी इनपुट को निश्चित लंबाई के डाइजेस्ट में बदल देता है, और आप डाइजेस्ट को वापस इनपुट में नहीं बदल सकते. यह गुण हैशिंग को किसी फ़ाइल की अखंडता जाँचने या मूल को सहेजे बिना मानों की तुलना करने के लिए उपयोगी बनाता है. पेच इनपुट की ओर है: किसी पासवर्ड, दस्तावेज़ या कॉन्फ़िग रहस्य का हैश निकालने के लिए आपको टूल को असली मान देना पड़ता है. यदि वह टूल किसी सर्वर पर चलता है, तो संवेदनशील इनपुट वहाँ चला जाता है, भले ही केवल हानिरहित डाइजेस्ट लौटाया जाए. हैश को स्थानीय रूप से निकालने से इनपुट आपके डिवाइस पर ही रहता है, इसलिए आपको ज़रूरी डाइजेस्ट मिल जाता है और जो आप हैश कर रहे थे वह उजागर नहीं होता.

Base64 encoding: byte mapping और padding

Base64 तीन input bytes (24 bits) को चार 6-bit values में समूहित करके 8-bit bytes को 6-bit characters में translate करता है। प्रत्येक 6-bit value Base64 alphabet (A-Z, a-z, 0-9, +, /) में एक character से map होती है। चूंकि process को 24 bits से विभाज्य inputs की आवश्यकता होती है, छोटे inputs को padded किया जाता है: एक remaining byte दो padding characters (==) उत्पन्न करती है, दो remaining bytes एक (=) उत्पन्न करती हैं। Base64url variant, जो JSON Web Tokens (JWTs) में उपयोग होता है, string को URL-safe बनाने के लिए + को - से और / को _ से बदलता है, और = padding को पूरी तरह हटा देता है, क्योंकि padding characters strict URI parsers में errors का कारण बन सकते हैं। यह अंतर पहचानना token handling debug करते समय मायने रखता है: एक JWT जो malformed लगे वह वास्तव में standard Base64 के बजाय Base64url-encoded हो सकती है।

JWT signatures: HS256, RS256 और algorithm confusion

JSON Web Token की सुरक्षा पूरी तरह उसके signature पर निर्भर करती है, जो तीसरा dot-separated segment है। HS256 (HMAC-SHA256) के साथ, server एक secret key का उपयोग करके Base64url-encoded header और payload sign करता है। SHA-256 hash function collision resistance प्रदान करती है: secret key जाने बिना एक modified payload उत्पन्न करना जो उसी signature पर hash हो, computationally असंभव है। RS256 के साथ, server RSA private key से sign करता है और public key से verify करता है। algorithm confusion नामक एक ज्ञात vulnerability तब उत्पन्न होती है जब कोई server library expected algorithm type को सख्ती से enforce नहीं करती। एक हमलावर token header के alg field को RS256 से HS256 में बदल सकता है और server की public key को HMAC secret के रूप में उपयोग करके token sign कर सकता है, क्योंकि public keys अक्सर सुलभ होती हैं। ब्राउज़र में JWT header को locally decode करने से आप यह verify कर सकते हैं कि कौन सा algorithm वास्तव में निर्दिष्ट है, बिना active token को third-party logging systems के सामने expose किए।

इस लेख में उल्लेखित टूल्स

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

क्या Base64 या URL एनकोडिंग सुरक्षा का एक रूप है?

नहीं. दोनों उलटे जा सकने वाले एनकोडिंग हैं जो डेटा के सुरक्षित परिवहन के लिए बने हैं, उसकी रक्षा के लिए नहीं. जो भी एनकोड की गई स्ट्रिंग पढ़ सकता है वह उसे बिना किसी कुंजी या पासवर्ड के तुरंत डिकोड कर लेता है. यदि आपको किसी मान को गोपनीय रखना है, तो उसे उपयुक्त एल्गोरिदम से एन्क्रिप्ट करें और कुंजी अलग से संभालें. Base64 या प्रतिशत एनकोड किसी भी मान को ऐसे मानें मानो वह सादे टेक्स्ट में लिखा हो.

मैं टोकन कहाँ डिकोड करता हूँ या पासवर्ड कहाँ हैश करता हूँ, इससे क्या फ़र्क पड़ता है?

क्योंकि संवेदनशील हिस्सा इनपुट है. एक मान्य JWT एक जीवित क्रेडेंशियल है, और आप जो पासवर्ड हैश करते हैं वह असली रहस्य है. सर्वर पर आधारित टूल कोई परिणाम लौटाने से पहले ही वह कच्चा इनपुट पा लेता है, यानी एक प्रति लॉग की जा सकती है या ऐसी जगह रखी जा सकती है जिसे आप नहीं देखते. आपके ब्राउज़र में चलने वाला टूल वही क्रिया आपके अपने डिवाइस की मेमोरी में करता है, इसलिए टोकन या पासवर्ड कभी कहीं नहीं भेजा जाता.