कीसेट

Tink, कुंजी रोटेशन की सुविधा चालू करने के लिए Keysets का इस्तेमाल करता है. आसान शब्दों में कहें, तो कीसेट, कुंजियों की एक ऐसी सूची होती है जिसमें कम से कम एक कुंजी होती है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 का कोई उपयोगकर्ता एक ऐसा प्रोग्राम लिख रहा है जो पहले किसी केएमएस से कीसेट हासिल करता है. इसके बाद, इस कीसेट से एक AEAD ऑब्जेक्ट बनाता है. आखिर में, इस ऑब्जेक्ट का इस्तेमाल करके, साइफ़रटेक्स्ट को एन्क्रिप्ट और डिक्रिप्ट करता है.

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

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

सिफ़रटेक्स्ट में मुख्य आइडेंटिफ़ायर

AEAD कीसेट के उदाहरण पर फिर से विचार करें. अगर इसे सामान्य तरीके से किया जाता है, तो साइफ़रटेक्स्ट को डिक्रिप्ट करने के लिए, Tink को कीसेट में मौजूद सभी कुंजियों का इस्तेमाल करके डिक्रिप्ट करने की कोशिश करनी होगी. ऐसा इसलिए, क्योंकि यह पता नहीं होता कि कीसेट को एन्क्रिप्ट करने के लिए किस कुंजी का इस्तेमाल किया गया था. इससे परफ़ॉर्मेंस पर काफ़ी असर पड़ सकता है.

इस वजह से, Tink, सिफ़र किए गए टेक्स्ट में आईडी से मिली 5-बाइट स्ट्रिंग को प्रीफ़िक्स के तौर पर इस्तेमाल करने की अनुमति देता है. ऊपर दी गई 'पूरी कुंजियां' की फ़िलॉसफ़ी के मुताबिक, यह प्रीफ़िक्स कुंजी का हिस्सा है. साथ ही, इस कुंजी से बनाए गए सभी सिफ़रटेक्स्ट में यह प्रीफ़िक्स होना चाहिए. उपयोगकर्ता, कुंजियां बनाते समय यह चुन सकते हैं कि कुंजी में इस तरह के प्रीफ़िक्स का इस्तेमाल किया जाना चाहिए या इसके बिना सिफ़रटेक्स्ट फ़ॉर्मैट का इस्तेमाल किया जाना चाहिए.

जब कोई कुंजी किसी कीसेट में होती है, तो Tink इस टैग का हिसाब उस आईडी से लगाता है जो कुंजी के पास कीसेट में होता है. किसी कीसेट में आईडी यूनीक होते हैं2. इसका मतलब है कि टैग यूनीक होते हैं. इसलिए, अगर सिर्फ़ टैग की गई कुंजियों का इस्तेमाल किया जाता है, तो एक कुंजी से डिक्रिप्ट करने की तुलना में परफ़ॉर्मेंस में कोई कमी नहीं आती: डिक्रिप्ट करते समय, Tink को सिर्फ़ एक कुंजी आज़माने की ज़रूरत होती है.

हालांकि, टैग कुंजी का हिस्सा होता है. इसलिए, इसका मतलब यह भी है कि कुंजी सिर्फ़ तब किसी कीसेट में हो सकती है, जब उसका कोई खास आईडी हो. अलग-अलग भाषाओं में मुख्य ऑब्जेक्ट के इस्तेमाल के बारे में बताते समय, इस बात का ध्यान रखना ज़रूरी है.

Tink वायर फ़ॉर्मैट के बारे में भी जानें.

ऐसी कुंजियां जिनके लिए आईडी की ज़रूरत है, लेकिन कोई आउटपुट प्रीफ़िक्स नहीं है

कुछ कुंजियों में एक खास आईडी होना चाहिए, लेकिन उनके आउटपुट में कोई प्रीफ़िक्स नहीं जोड़ा जाता है. उदाहरण के लिए, NO_PREFIX_WITH_PREHASH_ID वैरिएंट वाले हस्ताक्षर करने वाले कुंजियों (आउटपुट प्रीफ़िक्स टाइप WITH_ID_REQUIREMENT के साथ सेव की गई) से, बिना प्रीफ़िक्स वाले हस्ताक्षर जनरेट होते हैं. Prehash प्रिमिटिव के साथ इस तरह की कुंजी का इस्तेमाल करने पर, Tink कुंजी के आईडी को prehash वैल्यू में लिखता है. इससे रिमोट हस्ताक्षर करने वाले को पता चलता है कि उसे किस कुंजी से हस्ताक्षर करना है.

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


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

  2. Google की इंटरनल लाइब्रेरी के साथ काम करने के लिए, Tink ऐसे कीसेट इस्तेमाल करने की अनुमति देता है जिनमें आईडी दोहराए जाते हैं. आने वाले समय में, इस सुविधा को हटा दिया जाएगा. ↩