कीसेट

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

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

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

सादे टेक्स्ट को एन्क्रिप्ट करने में मुख्य आइडेंटिफ़ायर

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

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

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

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


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

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