password.es में क्या ग़लत था, और अब नहीं है

प्रकाशित लेखक David Carrero

इस ब्लॉग में बारह लेख हैं जो बताते हैं कि चीज़ें कैसे होनी चाहिए: कि लंबाई चिह्नों से ज़्यादा मायने रखती है, कि मैनेजर सुविधा नहीं बल्कि नियम निभाने का इकलौता तरीक़ा है, कि प्रतिशत कुछ नहीं कहता।

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

चेकर आपके टाइप करते समय जम जाता था

चेकर आपका पासवर्ड zxcvbn से जाँचता है — एक लाइब्रेरी जो बड़े अक्षर गिनने के बजाय पैटर्न ढूँढ़ती है। यह बहुत अच्छा काम करती है और इसकी क़ीमत है: यह पूरी की पूरी, एक साथ, उसी थ्रेड पर चलती है जो पेज बनाता है। जब तक चलती है, ब्राउज़र और कुछ नहीं कर सकता।

यह क़ीमत लंबाई के साथ तेज़ी से बढ़ती है। उसी बंडल से मापा गया जो साइट देती है, और उन पासवर्डों से जो लोग सचमुच लिखते हैं — शब्द, साल, a की जगह @:

लंबाई एक बार चलना
16 अक्षर 45 ms
20 अक्षर 121 ms
32 अक्षर 273 ms
64 अक्षर 843 ms
128 अक्षर 3,621 ms

यहाँ तक सामान्य। समस्या यह थी कि हम इसे कितनी बार चलाते थे।

उस खाने पर दो अलग-अलग श्रोता लगे थे, input और keyup। एक सामान्य कुंजी दोनों को चलाती है। यानी हर अक्षर पर पूरा विश्लेषण दो बार चलता था: 16 अक्षर के पासवर्ड पर 90 ms, 32 पर आधा सेकंड।

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

सुधार दो छोटे बदलाव हैं। हमने keyup श्रोता हटा दिया, क्योंकि input पहले ही टाइप करना, चिपकाना, मिटाना और मैनेजर का अपने-आप भरना — सब समेट लेता है: आधा काम ग़ायब हो जाता है और आपको दिखने वाली किसी चीज़ में कोई फ़र्क़ नहीं पड़ता। और हमने 150 मिलीसेकंड की प्रतीक्षा जोड़ी: जब तक आप लिख रहे हैं कुछ नहीं जाँचा जाता, और रुकते ही जाँचा जाता है। इतना धीरे कोई नहीं लिखता कि उसे पता चले।

नतीजा बिल्कुल वही है। Barcelona1992$ अब भी वही कहता है: कि «barcelona» शब्दकोश में है, कि 1992 साल जैसा लगता है, और कि वह एक सेकंड से कम में गिर जाता है।

विवरण पंद्रह भाषाओं में वाक्य के बीच में कटा था

यह ज़्यादा बेवक़ूफ़ी भरी और ज़्यादा शर्मनाक है।

खोज इंजन में शीर्षक के नीचे दिखने वाला वाक्य — मेटा विवरण — चेकर की अठारह में से पंद्रह भाषाओं में कटा हुआ था। सिर्फ़ स्पेनिश, कोरियाई और जापानी बचे थे। किसी ने कभी लंबाई के हिसाब से काटा, शब्द के बीच से काटा, और उसके बाद किसी ने देखा नहीं।

तीन भाषाओं में कट ठीक एक विशेष अक्षर के बीच पड़ा, तो गूगल पर हम यह छाप रहे थे:

भाषा हम क्या दे रहे थे क्या होना चाहिए था
पुर्तगाली …datas e padr&o padrões
तुर्की …arıyor ve ger&cced gerçekten
वियतनामी …chúng tôi tra mật kh&# mật khẩu

ध्यान खींचने वाली बात यह है कि यह कहाँ था: पूरी साइट के सबसे अच्छे चलने वाले पेज पर। चेकर जेनरेटर से कहीं बेहतर काम करता है, और टूटे विवरण के साथ ऐसा कर रहा था। पंद्रहों पूरे कर दिए गए हैं।

साथ ही कोरियाई, जापानी और वियतनामी में ब्रांड शीर्षक के शुरू से अंत में चला गया है। खोज परिणामों में डोमेन वैसे भी अलग दिखता है, तो «password.es ·» से शुरू करना सिर्फ़ उस जगह को गँवाना था जो सबसे भारी है।

दस करोड़ में एक का झुकाव

जेनरेटर हर अक्षर crypto.getRandomValues() से चुनता है, ब्राउज़र का अच्छा यादृच्छिक स्रोत। लेकिन उस विशाल संख्या को «वर्णमाला की एक जगह» में बदलने के लिए हम शेषफल लेते थे, और वहाँ एक क्लासिक जाल है: 2³² 83 का गुणज नहीं है, इसलिए वर्णमाला की शुरुआती जगहें आख़िरी वालों से ज़रा-सी ज़्यादा बार आती थीं

«ज़रा-सी» कितनी: 89 अक्षरों तक की वर्णमाला के साथ, दस करोड़ में एक के क्रम की। इससे कुछ नहीं बदलता। यह आपके पासवर्ड को नापने लायक़ कमज़ोर नहीं करती, दूर-दूर तक नहीं।

फिर भी हमने ठीक किया, और वह तीन पंक्तियाँ हैं: 4,294,967,296 संभव मानों में से बचे 45 को हटाकर दोबारा चुना जाता है। पासवर्ड की साइट पर, जब हटाने का ख़र्च इतना हो तो «यह नगण्य है» झुकाव छोड़ने की अच्छी वजह नहीं है।

जो कमी थी: वादे को ब्राउज़र से मनवाना

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

अब हर पेज एक कंटेंट सुरक्षा नीति लेकर चलता है। दो हिस्से जो मायने रखते हैं:

  • कोई भी स्क्रिप्ट नहीं चलती जो पेज बनाते समय उसमें नहीं थी। हर वैध स्क्रिप्ट अपनी छाप से हस्ताक्षरित है; घुसाई गई मेल नहीं खाती और ब्राउज़र उसे चलाने से इनकार कर देता है।
  • connect-src 'none' साइट जावास्क्रिप्ट से एक भी नेटवर्क अनुरोध नहीं करती, और अब इसे ब्राउज़र लागू करता है। अगर कभी कुछ आपके लिखे को कहीं भेजने की कोशिश करे, तो वह बाहर नहीं जाएगा।

वादा एक घोषणा होना छोड़कर नियम बन गया।

जो अब भी ग़लत है

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

यहीं यह लेख अपनी जगह कमाता है।

पंद्रह भाषाएँ अब भी चेकर को पुराने इंजन के रूप में बताती हैं। उन पेजों का पाठ कहता है कि वह PasswordMeter के क्लासिक लॉजिक को दोहराता है। अब नहीं: वह इंजन इसलिए बदला गया क्योंकि वह Password1! को «बहुत मज़बूत» कहता था और पाँच शब्दों के लंबे वाक्यांश को फेल कर देता था — यानी ठीक उल्टा। स्पेनिश, कोरियाई और जापानी अपडेट हैं; बाक़ी पंद्रह नहीं।

एक ही घर में दो अलग पैमाने हैं। मुखपृष्ठ पासवर्ड की मज़बूती उसके बिट्स से तय करता है; चेकर उसे तोड़ने में लगने वाले समय से तय करता है। अलग कसौटियाँ, और हम कहीं यह नहीं बताते।

जेनरेटर और चेकर एक जैसे चिह्न नहीं गिनते: एक 27 इस्तेमाल करता है, दूसरा 33 मानता है। फ़र्क़ छोटा है, पर है।

इनमें से कोई भी गंभीर नहीं है। तीनों उधार हैं, और वे किसी और के ढूँढ़ने का इंतज़ार करने से बेहतर यहाँ लिखा होना पसंद करेंगी।

इस संस्करण का बदलाव-रिकॉर्ड

चूँकि रिपॉज़िटरी सार्वजनिक नहीं है, बदलावों का रिकॉर्ड पूरा यहीं है। संस्करण 0.2.0, 31 अगस्त 2026:

जोड़ा गया। हर पेज के लिए कंटेंट सुरक्षा नीति, हर स्क्रिप्ट की छाप के साथ। आपके सहेजे गए पासवर्ड कहाँ हैं, इस पर लेख, अठारहों भाषाओं में। एक संपादकीय क़तार जो तय करती है कि क्या लिखा जाए, और जो ख़ाली होने पर कुछ भी न छापने का आदेश देती है।

ठीक किया गया। चेकर का विवरण, पंद्रह भाषाओं में वाक्य के बीच कटा, जिनमें से तीन में एक अक्षर आधा टूटा हुआ। टाइप करते समय टैब का जमना। चयन का झुकाव। और पिछले लेख में जो तस्वीर नहीं थी।

बदला गया। कोरियाई, जापानी और वियतनामी में चेकर का शीर्षक। तैनाती, जो अब तब चलती है जब बनी हुई साइट पहले से मौजूद हो, एक मिनट पहले नहीं। और वियतनामी, हिंदी तथा अरबी अनुवाद, जो सबसे कमज़ोर बने रहने के बावजूद अब किसी प्रकाशन को नहीं रोकते।


इस लेख के आँकड़े मापे गए हैं, अनुमानित नहीं: zxcvbn के समय उसी बंडल से जो साइट देती है और शब्दों व प्रतिस्थापनों वाले पासवर्डों से; चयन का झुकाव, 32-बिट पूर्णांक के 4,294,967,296 मानों पर गणना करके। चेकर का इंजन zxcvbn है, मुक्त स्रोत।

तस्वीर: Ernandes Alves · Pexels

← ब्लॉग पर वापस