जुड़े हुए डेटा के साथ पुष्टि किया गया एन्क्रिप्ट (सुरक्षित) किया गया डेटा (एडीएडी)

डेटा एन्क्रिप्शन के लिए, पुष्टि किए गए डेटा के साथ एन्क्रिप्शन (एईएडी) प्रिमिटिव का इस्तेमाल सबसे ज़्यादा किया जाता है. यह ज़्यादातर ज़रूरतों के लिए सही है.

AEAD में ये प्रॉपर्टी होती हैं:

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

आपके बच्चे का डेटा

AEAD का इस्तेमाल, साइफ़रटेक्स्ट को किसी खास डेटा से जोड़ने के लिए किया जा सकता है. मान लें कि आपके पास एक डेटाबेस है, जिसमें user-id और encrypted-medical-history फ़ील्ड हैं. इस उदाहरण में, encrypted-medical-history को एन्क्रिप्ट (सुरक्षित) करते समय, user-id को असोसिएटेड डेटा के तौर पर इस्तेमाल किया जा सकता है. इससे हमलावर को किसी उपयोगकर्ता की मेडिकल हिस्ट्री को दूसरे उपयोगकर्ता के खाते में ट्रांसफ़र करने से रोका जा सकता है.

आपके बच्चे का डेटा देना ज़रूरी नहीं है. अगर ऐसा किया जाता है, तो डिक्रिप्ट करने की प्रोसेस सिर्फ़ तब पूरी होगी, जब एन्क्रिप्ट और डिक्रिप्ट, दोनों कॉल में एक जैसा डेटा पास किया गया हो.

कुंजी का टाइप चुनें

हम ज़्यादातर मामलों में AES128_GCM का इस्तेमाल करने का सुझाव देते हैं. हालांकि, अलग-अलग ज़रूरतों के लिए कई तरह की कुंजियां उपलब्ध हैं. AES128, 128-बिट सुरक्षा देता है. वहीं, AES256, 256-बिट सुरक्षा देता है.

मोड चुनते समय, सुरक्षा से जुड़ी इन दो बातों का ध्यान रखना ज़रूरी है:

  1. QPS: एक ही कुंजी से कितने मैसेज एन्क्रिप्ट किए जाते हैं?
  2. मैसेज का साइज़: मैसेज कितने बड़े हैं?

आम तौर पर ये उपाय अपनाएं:

  • एईएस-सीटीआर-एचएमएसी (AES128_CTR_HMAC_SHA256, AES256_CTR_HMAC_SHA256), 16 बाइट के इनिशियलाइज़ेशन वेक्टर (आईवी) के साथ सबसे सुरक्षित मोड है.
  • AES-EAX (AES128_EAX, AES256_EAX), AES128_CTR_HMAC_SHA256 की तुलना में थोड़ा कम कंज़र्वेटिव और थोड़ा तेज़ है.
  • AES-GCM (AES128_GCM, AES256_GCM) आम तौर पर सबसे तेज़ मोड होता है. इसमें मैसेज की संख्या और मैसेज के साइज़ पर सबसे ज़्यादा पाबंदियां होती हैं. जब सादे टेक्स्ट और उससे जुड़े डेटा की लंबाई (नीचे) की इन सीमाओं से ज़्यादा हो जाती है, तो AES-GCM काम नहीं करता और मुख्य जानकारी लीक हो जाती है.
  • AES-GCM-SIV (AES128_GCM_SIV, AES256_GCM_SIV), AES-GCM की तरह ही तेज़ है. इसमें मैसेज की संख्या और मैसेज के साइज़ के लिए, AES-GCM के जैसी ही सीमाएं होती हैं. हालांकि, इन सीमाओं के पार जाने पर, यह कम गंभीर तरीके से काम नहीं करता है: यह सिर्फ़ इस बात का खुलासा कर सकता है कि दो मैसेज एक जैसे हैं. इसकी वजह से, इसका इस्तेमाल AES-GCM से ज़्यादा सुरक्षित होता है. हालांकि, इसका इस्तेमाल कम किया जाता है. इसे Java में इस्तेमाल करने के लिए, आपको Conscrypt इंस्टॉल करना होगा.
  • XChaCha20-Poly1305 (XCHACHA20_POLY1305) में, AES-GCM की तुलना में मैसेज की संख्या और मैसेज के साइज़ की सीमा बहुत ज़्यादा होती है. हालांकि, अगर यह काम नहीं करता है (ऐसा बहुत कम होता है), तो यह कुंजी की जानकारी भी लीक कर देता है. यह हार्डवेयर से तेज़ी लाने की सुविधा के साथ काम नहीं करता है. इसलिए, यह उन स्थितियों में AES मोड से धीमा हो सकता है जहां हार्डवेयर से तेज़ी लाने की सुविधा उपलब्ध है.

सुरक्षा की गारंटी

AEAD को लागू करने पर ये सुविधाएं मिलती हैं:

  • CCA2 सुरक्षा.
  • पुष्टि करने का तरीका कम से कम 80-बिट का होना चाहिए.
  • कम से कम 232 मैसेज को एन्क्रिप्ट (सुरक्षित) करने की सुविधा. इन मैसेज का कुल साइज़ 250 बाइट होना चाहिए. चुने गए 232 सामान्य टेक्स्ट या चुने गए सिफ़र टेक्स्ट में से किसी भी टेक्स्ट पर किए गए हमले के सफल होने की संभावना 2-32 से ज़्यादा नहीं है.

इस्तेमाल के उदाहरण

मुझे डेटा को एन्क्रिप्ट (सुरक्षित) करना है और मुझे साइफ़रटेक्स्ट को उसके कॉन्टेक्स्ट से बाइंड करना है.