Tink, कुंजी का नया वर्शन अपने-आप बनाने की सुविधा चालू करने के लिए, पासकोड सेट का इस्तेमाल करता है. आम तौर पर, पासकोड सेट, कुंजियों की ऐसी सूची होती है1 जिसमें एक कुंजी को मुख्य कुंजी के तौर पर चुना जाता है. उदाहरण के लिए, इस कुंजी का इस्तेमाल नए सादे टेक्स्ट को साइन और एन्क्रिप्ट करने के लिए किया जाता है. इसके अलावा, किसी पासकोड सेट में मौजूद कुंजियों को एक यूनीक आईडी2 और कुंजी का स्टेटस मिलता है. इससे, कुंजियों को पासकोड सेट से हटाए बिना उन्हें बंद किया जा सकता है.
उपयोगकर्ता, क्लास KeysetHandle
के ज़रिए बटन को ऐक्सेस कर सकते हैं. इसके लिए, मुख्य तौर पर कीसेट का इस्तेमाल किया जाता है. इससे यह पक्का होता है कि हर उपयोगकर्ता के पास एक साथ कई बटन को मैनेज करने के लिए कोड हो. क्रिप्टोग्राफ़ी का इस्तेमाल करने वाले ज़्यादातर लोगों के लिए, एक से ज़्यादा पासकोड मैनेज करना ज़रूरी होता है: पासकोड बदलने की सुविधा होनी चाहिए (उदाहरण के लिए, पुराने पासकोड लीक हो सकते हैं). साथ ही, "अगले पासकोड पर स्विच करें" जैसा कोई ऐसा विकल्प कभी नहीं होता जिसे दुनिया भर में, एक ही समय पर, कोड चलाने वाली मशीनों और सभी सिफरटेक्स्ट पर लागू किया जा सके. इसलिए, उपयोगकर्ता को ऐसा कोड लिखना होगा जो एक बटन से दूसरे बटन पर जाने पर काम करे.
उदाहरण: AEAD
AEAD कीवर्ड सेट पर विचार करें, जिसमें AEAD प्राइमिटिव के लिए कई कुंजियां होती हैं. जैसा कि पहले बताया गया है, हर बटन दो फ़ंक्शन के बारे में खास तौर पर बताता है: \(\mathrm{Enc}\) और \(\mathrm{Dec}\). पासकोड में अब दो नए फ़ंक्शन भी शामिल किए गए हैं: \(\mathrm{Enc}\) और \(\mathrm{Dec}\) - \(\mathrm{Enc}\) , पासकोड की मुख्य कुंजी के फ़ंक्शन \(\mathrm{Enc}\) के बराबर होता है. वहीं, फ़ंक्शन \(\mathrm{Dec}\) , सभी कुंजियों के साथ डिक्रिप्ट करने की कोशिश करता है. इसके लिए, वह कुंजियों को किसी क्रम में इस्तेमाल करता है. Tink इसकी परफ़ॉर्मेंस को कैसे बेहतर बनाता है, यह जानने के लिए यहां देखें.
यह ध्यान देने वाली बात है कि कीसेट पूरी कुंजियां होती हैं:
इनमें इस्तेमाल किए गए फ़ंक्शन \(\mathrm{Enc}\) और
\(\mathrm{Dec}\) की पूरी जानकारी होती है. इसका मतलब है कि उपयोगकर्ता ऐसी क्लास लिख सकते हैं जिसमें KeysetHandle
को इनपुट के तौर पर इस्तेमाल किया जाता है. इससे यह पता चलता है कि क्लास को ऑब्जेक्ट की पूरी जानकारी \(\mathrm{Enc}\) और \(\mathrm{Dec}\) काम करने के लिए की ज़रूरत है. इससे उपयोगकर्ता को ऐसे एपीआई लिखने में मदद मिलती है जो यह बताते हैं कि: इस क्लास का इस्तेमाल करने के लिए, आपको क्रिप्टोग्राफ़िक प्रिमिटिव की जानकारी देनी होगी.
डेटा सुरक्षित करने वाली कुंजी का नया वर्शन बनाना
मान लें कि कोई Tink उपयोगकर्ता ऐसा प्रोग्राम लिख रहा है जो पहले किसी KMS से एक पासकोड सेट पाता है. इसके बाद, इस पासकोड सेट से एक एईएडी ऑब्जेक्ट बनाता है और आखिर में, इस ऑब्जेक्ट का इस्तेमाल करके, सिफरटेक्स्ट को एन्क्रिप्ट और डिक्रिप्ट करता है.
इस तरह का उपयोगकर्ता, पासकोड रोटेशन के लिए अपने-आप तैयार हो जाता है. साथ ही, अगर उसकी मौजूदा पसंद अब स्टैंडर्ड के मुताबिक नहीं है, तो एल्गोरिदम स्विच कर देता है.
हालांकि, पासकोड को रोटेट करने की इस सुविधा को लागू करते समय थोड़ी सावधानी बरतनी चाहिए: सबसे पहले, केएमएस को पासकोड के सेट में एक नई पासकोड जोड़ना चाहिए (हालांकि, इसे अभी प्राइमरी पासकोड के तौर पर सेट नहीं करना चाहिए). इसके बाद, सभी बाइनरी के लिए नया कीसेट रोल आउट करना होगा, ताकि इस कीसेट का इस्तेमाल करने वाली हर बाइनरी में, कीसेट में सबसे नई कुंजी हो. इसके बाद ही, नई कुंजी को मुख्य कुंजी बनाया जाना चाहिए. साथ ही, इससे बनने वाला कीसेट, कीसेट का इस्तेमाल करके सभी बाइनरी में फिर से डिस्ट्रिब्यूट किया जाता है.
सिफरटेक्स्ट में मौजूद मुख्य आइडेंटिफ़ायर
AEAD पासकोड के उदाहरण पर फिर से विचार करें. अगर सीधे तौर पर, सिफरटेक्स्ट को डिक्रिप्ट किया जाता है, तो Tink को पासकोड में मौजूद सभी कुंजियों का इस्तेमाल करके डिक्रिप्ट करने की कोशिश करनी पड़ती है. ऐसा इसलिए, क्योंकि यह पता नहीं चलता कि पासकोड को एन्क्रिप्ट करने के लिए किस कुंजी का इस्तेमाल किया गया था. इससे परफ़ॉर्मेंस पर काफ़ी असर पड़ सकता है.
इस वजह से, Tink, आईडी से मिली पांच बाइट की स्ट्रिंग के साथ, सिफरटेक्स्ट को प्रीफ़िक्स करने की अनुमति देता है. ऊपर दिए गए 'पूरी कुंजियों' के सिद्धांत के मुताबिक, यह प्रीफ़िक्स कुंजी का हिस्सा है. साथ ही, इस कुंजी से मिले सभी सिफरटेक्स्ट में यह प्रीफ़िक्स होना चाहिए. उपयोगकर्ता, कुंजियां बनाते समय यह चुन सकते हैं कि कुंजी में इस तरह का प्रीफ़िक्स इस्तेमाल किया जाए या बिना प्रीफ़िक्स के सिफरटेक्स्ट फ़ॉर्मैट का इस्तेमाल किया जाए.
जब कोई कुंजी किसी कीसेट में होती है, तो Tink उस कुंजी के आईडी से इस टैग का हिसाब लगाता है जो कीसेट में मौजूद होता है. किसी कीसेट में आईडी यूनीक2 होते हैं, इसका मतलब है कि टैग यूनीक होते हैं. इसलिए, अगर सिर्फ़ टैग की गई कुंजियों का इस्तेमाल किया जाता है, तो एक कुंजी से डिक्रिप्ट करने की तुलना में, परफ़ॉर्मेंस में कोई कमी नहीं आती: डिक्रिप्ट करते समय, Tink को सिर्फ़ एक कुंजी आज़मानी होती है.
हालांकि, टैग कुंजी का हिस्सा होता है. इसका मतलब यह भी है कि कुंजी सिर्फ़ तब किसी कीवर्ड सेट में हो सकती है, जब उसका एक खास आईडी हो. अलग-अलग भाषाओं में मुख्य ऑब्जेक्ट को लागू करने के बारे में बताते समय, इसका कुछ असर पड़ता है.
-
Tink के कुछ हिस्से अब भी पासकोड को सेट के तौर पर इस्तेमाल करते हैं. हालांकि, इसे बदला जाना चाहिए. इसकी वजह यह है कि आम तौर पर क्रम ज़रूरी होता है: उदाहरण के लिए, Aead के साथ पासकोड बदलने के सामान्य लाइफ़साइकल पर विचार करें. सबसे पहले, किसी कीसेट में एक नई कुंजी जोड़ी जाती है. इस डिजिटल बटन को अभी तक मुख्य डिजिटल बटन नहीं बनाया गया है, लेकिन यह चालू है. यह नया कीसेट, सभी बाइनरी के लिए लॉन्च किया गया है. जब सभी बाइनरी को नई कुंजी के बारे में पता चल जाता है, तो उस कुंजी को मुख्य कुंजी बना दिया जाता है. सिर्फ़ इस समय इस कुंजी का इस्तेमाल करना सुरक्षित होता है. इस दूसरे चरण में, पासवर्ड बदलने की सुविधा को यह पता होना चाहिए कि आखिरी बार कौनसा पासवर्ड जोड़ा गया था. ↩
-
Google की इंटरनल लाइब्रेरी के साथ काम करने के लिए, Tink ऐसे कीसेट इस्तेमाल करने की अनुमति देता है जिनमें आईडी दोहराए जाते हैं. आने वाले समय में, यह सहायता हटा दी जाएगी. ↩