FlowingDev

TOTP की कहानी: आपका फ़ोन कैसे जानता है सीक्रेट हैंडशेक

जानें कि टाइम-बेस्ड वन-टाइम पासवर्ड (TOTP) एक शेयर्ड सीक्रेट और वर्तमान समय का उपयोग करके ऑथेंटिकेशन की एक सुरक्षित दूसरी लेयर कैसे बनाते हैं।

टूल आज़माएँ: TOTP / 2FA जेनरेटर

एक वाक्य में

TOTP एक एल्गोरिथ्म है जो एक शेयर्ड सीक्रेट और वर्तमान समय से लगातार बदलने वाला, अस्थायी न्यूमेरिक कोड बनाता है, जिसका उपयोग लॉग इन करने के लिए दूसरे फैक्टर के रूप में किया जाता है।

यह क्या समस्या हल करता है

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

यहीं पर मल्टी-फैक्टर ऑथेंटिकेशन (MFA), और इसका सबसे आम रूप, टू-फैक्टर ऑथेंटिकेशन (2FA), काम आता है। इसका आईडिया आपकी पहचान को सिर्फ़ कुछ ऐसा जो आप जानते हैं (एक पासवर्ड) से ज़्यादा कुछ से साबित करना है। आपको कुछ ऐसा जो आपके पास है (जैसे आपका फ़ोन) या कुछ ऐसा जो आप हैं (जैसे आपका फिंगरप्रिंट) की भी ज़रूरत होती है।

शुरुआती 2FA का मतलब अक्सर SMS के ज़रिए कोड पाना होता था। यह कुछ नहीं से तो बेहतर था, लेकिन इसमें "SIM स्वैपिंग" हमलों का खतरा होता है, जहाँ एक स्कैमर आपके सेल प्रोवाइडर को आपका नंबर अपने फ़ोन पर ट्रांसफर करने के लिए मना लेता है। और अचानक, आपके 2FA कोड उसे मिलने लगते हैं। यह अच्छी बात नहीं है।

अब आती है ऐप-आधारित ऑथेंटिकेटर की बारी। फ़ोन नेटवर्क की डांवाडोल सुरक्षा पर निर्भर रहने के बजाय, आपके डिवाइस पर एक ऐप स्थानीय रूप से कोड जनरेट कर सकती है। लेकिन आपके Google Authenticator ऐप को कैसे पता चलता है कि आपके GitHub अकाउंट के लिए कोड कैसे जनरेट करना है? और आपका Microsoft Authenticator आपके Dropbox से कैसे बात करना जानता है?

वे सभी एक ही ओपन-स्टैंडर्ड भाषा बोलते हैं: TOTP, यानी टाइम-बेस्ड वन-टाइम पासवर्ड। TOTP वह गुमनाम हीरो है जो आपके दूसरे फैक्टर को किसी एक कंपनी से अलग कर देता है। यह एक खुला, इंटरऑपरेबल स्टैंडर्ड है जो किसी भी कम्पैटिबल ऐप को किसी भी कम्पैटिबल सर्विस के साथ काम करने देता है। यह HOTP (जो एक साधारण काउंटर पर आधारित था) नामक एक पुराने स्टैंडर्ड का विकास है, लेकिन समय को चलते-फिरते हिस्से के रूप में उपयोग करके, TOTP बहुत ज़्यादा यूज़र-फ्रेंडली बन गया।

यह अंदर से कैसे काम करता है

TOTP जादू जैसा लगता है। आप एक बार QR कोड स्कैन करते हैं, और हमेशा के लिए, आपका फ़ोन और दुनिया के दूसरे कोने में एक सर्वर हर 30 सेकंड में एक ही छह-अंकों की संख्या पर सहमत हो सकते हैं, बिना दोबारा कभी एक-दूसरे से बात किए। यह जादू नहीं है, यह बस कुछ बहुत ही चालाक क्रिप्टो है।

चलिए इस नुस्खे को तोड़कर समझते हैं।

शेयर्ड सीक्रेट: सल्तनत की चाबी

सब कुछ एक सीक्रेट से शुरू होता है। जब आप किसी सर्विस पर 2FA चालू करते हैं, तो सर्वर एक रैंडम, सीक्रेट की (key) जनरेट करता है (उदाहरण के लिए, 160 बिट्स की शुद्ध रैंडमनेस)। यह सीक्रेट एकमात्र चीज़ है जिसे आपको और सर्वर दोनों को जानना ज़रूरी है। पूरे सिस्टम की सुरक्षा इसे गुप्त रखने पर टिकी होती है।

बेशक, 160 रैंडम बिट्स की एक स्ट्रिंग बहुत यूज़र-फ्रेंडली नहीं होती। इसलिए हम इंसानों के लिए, इसे Base32 नामक फॉर्मेट में एन्कोड किया जाता है। अपने कज़िन Base64 के विपरीत, Base32 एक छोटे अल्फाबेट का उपयोग करता है जो केस-इनसेंसिटिव होता है और 1 और l, या 0 और O जैसे संदिग्ध कैरेक्टर्स से बचता है। यह इसे मैन्युअल रूप से टाइप करना संभव बनाता है (हालांकि अभी भी एक सिरदर्द है) अगर आप QR कोड को स्कैन नहीं कर सकते हैं।

एक सामान्य Base32 सीक्रेट ऐसा दिखता है: JBSWY3DPEHPK3PXPJBSWY3DPEHPK3PXP

इस सीक्रेट को आपके ऑथेंटिकेटर ऐप में लाने का सबसे आम तरीका एक QR कोड के माध्यम से है जो एक विशेष URI को एन्कोड करता है:

otpauth://totp/FlowingDev:user@example.com?secret=JBSWY3DPEHPK3PXP&issuer=FlowingDev

आपका ऐप इसे स्कैन करता है, जारीकर्ता (FlowingDev), अकाउंट का नाम (user@example.com), और सबसे महत्वपूर्ण, secret को सेव करता है। हैंडशेक पूरा हो गया।

चलता-फिरता हिस्सा: समय

TOTP में 'T' का मतलब टाइम-बेस्ड है। यह वह महत्वपूर्ण घटक है जो कोड को बदलता है। लेकिन सिस्टम मिलीसेकंड तक सटीक समय का उपयोग नहीं करता है—उसे सिंक करना असंभव होगा। इसके बजाय, यह एक अलग टाइम स्टेप का उपयोग करता है।

फ़ॉर्मूला सरल है:

TimeStep = floor(CurrentUnixTime / 30)

  • CurrentUnixTime: 1 जनवरी, 1970 (यूनिक्स एपोक) के बाद से गुज़रे सेकंड की संख्या।
  • / 30: टाइम स्टेप लगभग हमेशा 30 सेकंड होता है।

इस गणना का परिणाम एक इंटीजर होता है जो हर 30 सेकंड में ही बदलता है। सुबह 10:00:00 बजे, TimeStep का मान कुछ T होता है। सुबह 10:00:29 बजे, यह अभी भी T ही होता है। लेकिन सुबह 10:00:30 बजे, यह बढ़कर T+1 हो जाता है। यह TimeStep वह "मैसेज" है जिसे हम ऑथेंटिकेट करने जा रहे हैं।

क्रिप्टो का जादू: HMAC-SHA1

अब हम स्टैटिक सीक्रेट को बदलते हुए टाइम स्टेप के साथ मिलाते हैं। यह HMAC (हैश-बेस्ड मैसेज ऑथेंटिकेशन कोड) नामक एक क्रिप्टोग्राफ़िक प्रिमिटिव का उपयोग करके किया जाता है।

HMAC_Result = HMAC-SHA1(SecretKey, TimeStep)

HMAC को एक सिक्योर सिग्नेचर बनाने के तरीके के रूप में सोचें। यह हमारी सीक्रेट की (key) और उस डेटा को लेता है जिस पर हम साइन करना चाहते हैं (यानी TimeStep) और उन्हें एक हैश फ़ंक्शन—इस मामले में, पुराने और भरोसेमंद SHA-1—का उपयोग करके एक साथ मिला देता है।

आउटपुट 20-बाइट (160-बिट) का हैश होता है। यह एक लंबी, हेक्साडेसिमल स्ट्रिंग है जो उस विशेष सीक्रेट और उस विशेष टाइम स्टेप के लिए पूरी तरह से यूनिक होती है। सीक्रेट का एक बिट बदलें या टाइम स्टेप बदलने के लिए 30 सेकंड प्रतीक्षा करें, और आपको एक बिल्कुल अलग हैश मिलेगा।

हालांकि SHA-1 में सर्टिफिकेट साइन करने जैसे अन्य उद्देश्यों के लिए ज्ञात कमजोरियाँ हैं, फिर भी HMAC कंस्ट्रक्शन के अंदर उपयोग किए जाने पर इसे पूरी तरह से सुरक्षित माना जाता है। कई आधुनिक इम्प्लीमेंटेशन और ज़्यादा सुरक्षा के लिए HMAC-SHA256 या HMAC-SHA512 की ओर बढ़ रहे हैं।

छोटा करना: छह अंकों तक पहुँचना

एक 20-बाइट की हेक्स स्ट्रिंग एक यूज़र-फ्रेंडली छह-अंकों वाला कोड नहीं है। अंतिम चरण इस हैश को "डाइनैमिक रूप से छोटा करके" एक ऐसी संख्या में बदलना है जिसे हम वास्तव में उपयोग कर सकते हैं।

  1. ऑफसेट ढूँढें: 20-बाइट HMAC परिणाम के बिल्कुल आखिरी 4 बिट्स (निबल) को देखें। यह हमें 0 और 15 के बीच एक संख्या देता है। यह हमारा offset है।
  2. 4 बाइट्स उठाएँ: 20-बाइट हैश में उस offset स्थिति से शुरू करते हुए, अगले 4 बाइट्स (32 बिट्स) को पकड़ें।
  3. टॉप बिट को साफ़ करें: इस 32-बिट चंक को लें और 0x7FFFFFFF के साथ एक बिटवाइज़ AND करें। यह प्रभावी रूप से सबसे पहले बिट से छुटकारा दिलाता है, जो कुछ संभावित साइन्ड बनाम अनसाइन्ड इंटीजर समस्याओं को हल करता है और सुनिश्चित करता है कि परिणाम हमेशा पॉजिटिव हो।
  4. अब मॉड्यूलो की बारी! अब आपके पास एक बड़ा 31-बिट इंटीजर है। इसे 6 अंकों तक लाने के लिए, आप इसे 1,000,000 (10^6) से मॉड्यूलो करते हैं।
  5. ज़ीरो से पैड करें: परिणाम आपका कोड है! यदि संख्या, मान लीजिए, 4521 है, तो आप इसे 004521 बनाने के लिए इसके आगे ज़ीरो लगा देते हैं।

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

असल दुनिया की कहानियाँ

GitHub अकाउंट टेकओवर जो हो न सका

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

सबक: TOTP एक महत्वपूर्ण फ़ायरवॉल के रूप में कार्य करता है। यह एक संभावित विनाशकारी पासवर्ड लीक को एक हानिरहित, असफल लॉगिन प्रयास में बदल देता है।

ऑफ़लाइन एक्सेस की इमरजेंसी

एक नेटवर्क इंजीनियर एक कॉन्फ्रेंस के लिए फ़्लाइट में है। टेकऑफ़ के तीस मिनट बाद, उन्हें एक महत्वपूर्ण प्रोडक्शन सिस्टम की जाँच करने की आवश्यकता होती है। कोई इन-फ़्लाइट वाई-फ़ाई और ज़ीरो सेल सर्विस नहीं है। एक SMS या पुश-आधारित 2FA बेकार होता। लेकिन उनका डैशबोर्ड TOTP से सुरक्षित है। वे अपना लैपटॉप खोलते हैं, लॉगिन पेज लाते हैं, अपने फ़ोन पर ऑथेंटिकेटर ऐप खोलते हैं, और छह-अंकों का कोड टाइप करते हैं। ऐप को किसी इंटरनेट कनेक्शन की आवश्यकता नहीं है; इसका गणित आत्मनिर्भर है, जो केवल शेयर्ड सीक्रेट और फ़ोन की आंतरिक घड़ी पर निर्भर करता है। वे लॉग इन करते हैं और फ़्लाइट अटेंडेंट के पेय सेवा शुरू करने से पहले ही समस्या का समाधान कर देते हैं।

सबक: TOTP की पूरी तरह से ऑफ़लाइन काम करने की क्षमता इसे अविश्वसनीय रूप से मज़बूत और महत्वपूर्ण एक्सेस के लिए विश्वसनीय बनाती है, चाहे आप कहीं भी हों।

क्रॉस-प्लेटफ़ॉर्म माइग्रेशन का सिरदर्द... सुलझ गया

एक लंबे समय से Android यूज़र iPhone पर स्विच करने का फैसला करता है। वे Google Authenticator खोलते हैं और यह देखकर चौंक जाते हैं कि "मेरे नए फ़ोन से सिंक करें" जैसा कोई आसान बटन नहीं है। उनके पास 30 से अधिक अकाउंट सेट अप हैं, और हर एक के लिए 2FA-रीसेट प्रक्रिया से गुजरने का विचार एक बुरे सपने जैसा है। लेकिन फिर उन्हें अपनी व्यक्तिगत सुरक्षा नीति याद आती है: हर नई सर्विस के लिए, वे शुरुआती QR कोड को अपने एन्क्रिप्टेड पासवर्ड मैनेजर में एक स्क्रीनशॉट के रूप में सहेजते रहे हैं। वे अपने iPhone पर एक नया ऑथेंटिकेटर ऐप इंस्टॉल करते हैं, अपना पासवर्ड मैनेजर खोलते हैं, और एक-एक करके, सहेजे गए QR कोड को फिर से स्कैन करते हैं। दस मिनट में, सभी 30 अकाउंट माइग्रेट हो जाते हैं और पूरी तरह से काम कर रहे होते हैं।

सबक: TOTP सीक्रेट (एक Base32 स्ट्रिंग या QR कोड के रूप में) ही असली चाबी है। अपने सीक्रेट्स का सुरक्षित रूप से बैकअप लेकर किसी एक ऑथेंटिकेटर ऐप से स्वतंत्र होना आपको सच्चा स्वामित्व और पोर्टेबिलिटी देता है।

आम गलतियाँ और जाल

  • सीक्रेट को हल्के में लेना। सेटअप के समय आपको दिया गया QR कोड या Base32 स्ट्रिंग ही सीक्रेट की (key) है। यदि कोई हमलावर इसे प्राप्त कर लेता है, तो वे हमेशा के लिए वैध कोड उत्पन्न कर सकते हैं। इसका स्क्रीनशॉट लेकर अपने डेस्कटॉप पर न छोड़ें, इसे खुद को ईमेल न करें, और इसे एक प्लेन टेक्स्ट फ़ाइल में स्टोर न करें। इसे एक मास्टर पासवर्ड की तरह समझें।
  • रिकवरी कोड सहेजना भूल जाना। जब आप 2FA चालू करते हैं, तो लगभग हर सर्विस आपको एक बार उपयोग होने वाले रिकवरी कोड का एक सेट प्रदान करेगी। उन्हें प्रिंट करें। उन्हें एक सुरक्षित स्थान पर सहेजें (एक असली तिजोरी, या कम से कम, आपके पासवर्ड मैनेजर में)। यदि आप अपना फ़ोन खो देते हैं, तो ये कोड एक दर्दनाक सपोर्ट प्रक्रिया के बिना आपके अकाउंट में वापस जाने का एकमात्र तरीका हैं।
  • यह मान लेना कि आपके ऑथेंटिकेटर ऐप का बैकअप लिया गया है। कई सरल ऑथेंटिकेटर ऐप्स (जैसे मूल Google Authenticator) केवल उसी एक डिवाइस पर सीक्रेट्स स्टोर करते हैं। यदि फ़ोन खो जाता है या वाइप हो जाता है, तो सीक्रेट्स हमेशा के लिए चले जाते हैं। एक ऐसे ऐप का उपयोग करें जो सुरक्षित, एन्क्रिप्टेड क्लाउड सिंक प्रदान करता है (जैसे Authy या 1Password) या अपने सीक्रेट्स का मैन्युअल रूप से बैकअप लेने में अनुशासित रहें।
  • क्लॉक ड्रिफ्ट को नज़रअंदाज़ करना। TOTP टाइम-बेस्ड है। यदि आपके फ़ोन की घड़ी वास्तविक समय से एक या दो मिनट से अधिक आगे-पीछे है, तो जो कोड वह उत्पन्न करेगा, वे अस्वीकार कर दिए जाएंगे। हमेशा अपने फ़ोन और कंप्यूटर को "Set time automatically" पर सेट करें। जब वैध कोड अचानक काम करना बंद कर देते हैं तो लगभग हमेशा यही दोषी होता है।

यह आपकी नज़र में क्यों होना चाहिए

यदि आप एक डेवलपर हैं जो कोई ऐसा सिस्टम बना रहे हैं जिसमें यूज़र अकाउंट हैं, तो आपको MFA लागू करना चाहिए, और TOTP ऐप-आधारित 2FA के लिए सबसे अच्छा, ओपन-स्टैंडर्ड विकल्प है। यह SMS से अधिक सुरक्षित है और प्रोप्राइटरी पुश-नोटिफिकेशन सिस्टम से अधिक खुला है। एक सीक्रेट कैसे जनरेट करें, एक otpauth:// URI कैसे बनाएँ, और आने वाले टोकन को कैसे वैलिडेट करें, यह समझना सुरक्षित एप्लिकेशन बनाने के लिए एक मौलिक कौशल है।

भले ही आप कभी भी खुद एक TOTP सिस्टम लागू न करें, आप AWS, Cloudflare, GitHub, और npm जैसे प्लेटफ़ॉर्म पर उनके यूज़र हैं। यह जानना कि जादू पर्दे के पीछे कैसे काम करता है, आपको इसे अधिक सुरक्षित रूप से उपयोग करने के लिए सशक्त बनाता है। यह आपको शुरुआती सीक्रेट की सुरक्षा, अपने रिकवरी कोड को सहेजने, और अपनी ज़रूरतों के लिए सही ऑथेंटिकेटर ऐप चुनने के महत्व को समझने में मदद करता है। यह उस छोटे छह-अंकों वाले नंबर के रहस्य से पर्दा उठाता है जो आपके डेटा और बुरे लोगों के बीच खड़ा है।

और गहराई में जाएँ

थ्योरी हो गई। अब हाथ आज़माइए — 100% आपके ब्राउज़र में।

टूल आज़माएँ: TOTP / 2FA जेनरेटर