डेटा एन्क्रिप्शन के लिए, पुष्टि किए गए डेटा के साथ एन्क्रिप्शन (एईएडी) प्रिमिटिव का इस्तेमाल सबसे ज़्यादा किया जाता है. यह ज़्यादातर ज़रूरतों के लिए सही है.
AEAD में ये प्रॉपर्टी होती हैं:
- Secrecy: प्लेनटेक्स्ट के बारे में कुछ भी पता नहीं होता. सिर्फ़ इसकी लंबाई के बारे में जानकारी होती है.
- भरोसेमंद होना: एन्क्रिप्ट (सुरक्षित) किए गए टेक्स्ट के पीछे मौजूद सादे टेक्स्ट को बिना पता चले बदला नहीं जा सकता.
- सिमेट्रिक: इसमें प्लेनटेक्स्ट को एन्क्रिप्ट (सुरक्षित) करने और सिफ़रटेक्स्ट को डिक्रिप्ट (सुरक्षित तरीके से बदलना) करने के लिए, एक ही कुंजी का इस्तेमाल किया जाता है.
- रैंडमाइज़ेशन: एन्क्रिप्शन को रैंडमाइज़ किया जाता है. एक ही सादे टेक्स्ट वाले दो मैसेज से अलग-अलग सिफ़रटेक्स्ट मिलते हैं. हमलावर यह नहीं जान सकते कि कौनसा सिफ़र टेक्स्ट, दिए गए सादे टेक्स्ट से मेल खाता है. अगर आपको ऐसा नहीं करना है, तो इसके बजाय डिटरमिनिस्टिक एईएडी का इस्तेमाल करें.
आपके बच्चे का डेटा
AEAD का इस्तेमाल, साइफ़रटेक्स्ट को किसी खास असोसिएटेड डेटा से जोड़ने के लिए किया जा सकता है. मान लें कि आपके पास एक डेटाबेस है, जिसमें user-id और encrypted-medical-history फ़ील्ड हैं. इस उदाहरण में, user-id को encrypted-medical-history को एन्क्रिप्ट (सुरक्षित) करते समय, उससे जुड़ा डेटा के तौर पर इस्तेमाल किया जा सकता है. इससे हमलावर को किसी उपयोगकर्ता की मेडिकल हिस्ट्री को दूसरे उपयोगकर्ता के खाते में ट्रांसफ़र करने से रोका जा सकता है.
डेटा को लिंक करना ज़रूरी नहीं है. अगर ऐसा किया जाता है, तो डिक्रिप्ट करने की प्रोसेस सिर्फ़ तब पूरी होगी, जब एन्क्रिप्ट और डिक्रिप्ट, दोनों कॉल में एक जैसा डेटा पास किया गया हो.
कुंजी का टाइप चुनें
हमारा सुझाव है कि ज़्यादातर मामलों में AES128_GCM का इस्तेमाल करें. हालांकि, अलग-अलग ज़रूरतों के लिए कई तरह के मुख्य टाइप उपलब्ध हैं. 256-बिट सुरक्षा के लिए, यहां दिए गए AES128 को AES256 से बदलें. आम तौर पर ये उपाय अपनाएं:
- AES128_CTR_HMAC_SHA256, 16 बाइट के इनिशियलाइज़ेशन वेक्टर (IV) के साथ सबसे ज़्यादा सुरक्षित मोड है.
- AES128_EAX, AES128_CTR_HMAC_SHA256 की तुलना में थोड़ा कम कंज़र्वेटिव और थोड़ा तेज़ है.
- AES128_GCM आम तौर पर सबसे तेज़ मोड होता है. इसमें मैसेज की संख्या और मैसेज के साइज़ पर सबसे ज़्यादा पाबंदियां होती हैं. जब सादे टेक्स्ट और उससे जुड़े डेटा की लंबाई (नीचे दी गई) की इन सीमाओं को पार किया जाता है, तो AES128_GCM काम नहीं करता है और कुंजी का डेटा लीक हो जाता है.
- AES128_GCM_SIV, AES128_GCM की तरह ही तेज़ है. इसमें मैसेज की संख्या और मैसेज के साइज़ के लिए, AES128_GCM के जैसी ही सीमाएं होती हैं. हालांकि, इन सीमाओं के पार होने पर, यह कम गंभीर तरीके से काम नहीं करता: यह सिर्फ़ इस बात का खुलासा कर सकता है कि दो मैसेज एक जैसे हैं. इसकी वजह से, इसका इस्तेमाल AES128_GCM से ज़्यादा सुरक्षित है. हालांकि, इसका इस्तेमाल ज़्यादा नहीं किया जाता. इसे Java में इस्तेमाल करने के लिए, आपको Conscrypt इंस्टॉल करना होगा.
- XChaCha20Poly1305 में, AES128_GCM की तुलना में मैसेज की संख्या और मैसेज के साइज़ की सीमा बहुत ज़्यादा होती है. हालांकि, अगर यह काम नहीं करता है (ऐसा बहुत कम होता है), तो यह कुंजी की जानकारी भी लीक कर देता है. इसे हार्डवेयर से तेज़ी नहीं मिलती. इसलिए, जिन स्थितियों में हार्डवेयर से तेज़ी लाने की सुविधा उपलब्ध होती है उनमें यह AES मोड से ज़्यादा समय ले सकता है.
सुरक्षा की गारंटी
AEAD लागू करने पर ये सुविधाएं मिलती हैं:
- CCA2 सुरक्षा.
- पुष्टि करने का तरीका कम से कम 80-बिट का होना चाहिए.
- कम से कम 232 मैसेज को एन्क्रिप्ट (सुरक्षित) करने की सुविधा. इन मैसेज का कुल साइज़ 250 बाइट होना चाहिए. चुने गए 232 सामान्य टेक्स्ट या चुने गए सिफ़र टेक्स्ट में से किसी भी टेक्स्ट पर किए गए हमले के सफल होने की संभावना 2-32 से ज़्यादा नहीं है.
इस्तेमाल के उदाहरण
मुझे डेटा एन्क्रिप्ट (सुरक्षित) करना है और साइफ़रटेक्स्ट को उसके कॉन्टेक्स्ट से बाइंड करना है.