यह पहला पृष्ठ है जो Google के माध्यम से दिखाता है और सभी कार्यान्वयनों में सुरक्षा कमजोरियां मुझे परेशान करती हैं इसलिए मैं इसे पोस्ट कर रहा हूं दूसरों के लिए एन्क्रिप्शन के बारे में जानकारी जोड़ने के लिए क्योंकि यह मूल पोस्ट से 7 साल हो गया है। मैं कंप्यूटर इंजीनियरिंग में मास्टर्स डिग्री रखता हूं और क्रिप्टोग्राफी का अध्ययन करने और सीखने में बहुत समय बिताता हूं इसलिए मैं इंटरनेट को सुरक्षित जगह बनाने के लिए अपने दो सेंट फेंक रहा हूं।
इसके अलावा, ध्यान दें कि कार्यान्वयन की बहुत सारी स्थिति किसी भी स्थिति के लिए सुरक्षित हो सकती है, लेकिन क्यों उन का उपयोग करें और संभावित रूप से गलती से गलती करें? जब तक आपके पास कोई विशिष्ट कारण नहीं है, तब तक आपके पास उपलब्ध सबसे मजबूत साधनों का उपयोग करें। कुल मिलाकर मैं एक पुस्तकालय का उपयोग करने की सलाह देता हूं और यदि आप कर सकते हैं तो किटी के विवरण से दूर रहें।
अद्यतन 4/5/18: मैंने उन्हें कुछ हिस्सों को समझने के लिए सरल बनाया और जस्सीट से Google की नई लाइब्रेरी टिंक तक अनुशंसित लाइब्रेरी को बदलने के लिए कहा , मैं जसीप्ट को मौजूदा सेटअप से पूरी तरह से हटाने की सिफारिश करूंगा ।
प्रस्तावना
मैं नीचे सुरक्षित सममित क्रिप्टोग्राफी की मूल बातें रेखांकित करूंगा और उन सामान्य गलतियों को इंगित करूंगा जो ऑनलाइन देखते हैं जब लोग मानक जावा लाइब्रेरी के साथ क्रिप्टो को अपने दम पर लागू करते हैं। यदि आप Google के नए पुस्तकालय पर चलने वाले सभी विवरणों को छोड़ना चाहते हैं, तो अपने प्रोजेक्ट में आयात करें और अपने सभी एन्क्रिप्ट के लिए AES-GCM मोड का उपयोग करें और आप सुरक्षित रहेंगे।
अब अगर आप जावा में पढ़े जाने के तरीके के बारे में जानना चाहते हैं
सिफर को ब्लॉक करें
सबसे पहले आपको सबसे पहले एक सममित कुंजी ब्लॉक सिफर लेने की आवश्यकता है। एक ब्लॉक सिफर एक कंप्यूटर फ़ंक्शन / प्रोग्राम है जिसका उपयोग छद्म-यादृच्छिकता बनाने के लिए किया जाता है। छद्म-यादृच्छिकता नकली यादृच्छिकता है कि क्वांटम कंप्यूटर के अलावा कोई भी कंप्यूटर इसके और वास्तविक यादृच्छिकता के बीच का अंतर नहीं बता पाएगा। ब्लॉक सिफर क्रिप्टोग्राफी के लिए बिल्डिंग ब्लॉक की तरह है, और जब विभिन्न मोड या योजनाओं के साथ उपयोग किया जाता है तो हम एनक्रिप्ट बना सकते हैं।
अब ब्लॉक सिफर एल्गोरिथम उपलब्ध के बारे में आज करना सुनिश्चित करें कभी नहीं , मैं फिर कहता हूँ कभी नहीं का उपयोग डेस , मैं भी का उपयोग नेवर से होगा 3DES । केवल ब्लॉक सिफर जो स्नोडेन की एनएसए रिलीज भी सही मायने में छद्म-रैंडम के करीब होने की पुष्टि करने में सक्षम था, एईएस 256 है । एईएस 128 भी मौजूद है; अंतर एईएस 256 256-बिट ब्लॉक में काम करता है, जबकि एईएस 128 ब्लॉक में 128 काम करता है। सभी में, एईएस 128 सुरक्षित माना जाता है, हालांकि कुछ कमजोरियों की खोज की गई है, लेकिन 256 यह जितना ठोस होता है।
मजेदार तथ्य डेस को एनएसए ने वापस तोड़ दिया था जब इसे शुरू में स्थापित किया गया था और वास्तव में कुछ वर्षों के लिए एक रहस्य रखा गया था। हालाँकि कुछ लोग अभी भी 3DES के सुरक्षित होने का दावा करते हैं, फिर भी कुछ शोध पत्र ऐसे हैं जो 3DES में कमजोरियों का पता लगाते हैं और उनका विश्लेषण करते हैं ।
एन्क्रिप्शन मोड
एन्क्रिप्शन तब बनाया जाता है जब आप एक ब्लॉक सिफर लेते हैं और एक विशिष्ट योजना का उपयोग करते हैं ताकि यादृच्छिकता को कुंजी बनाने के लिए जोड़ा जाता है जो तब तक प्रतिवर्ती है जब तक आप कुंजी जानते हैं। इसे एक एन्क्रिप्शन मोड के रूप में संदर्भित किया जाता है।
यहाँ एक एन्क्रिप्शन मोड और ECB के रूप में जाना जाने वाला सबसे सरल मोड का एक उदाहरण है ताकि आप नेत्रहीन समझ सकें कि क्या हो रहा है:
एन्क्रिप्शन मोड आप सबसे अधिक ऑनलाइन देखेंगे निम्नलिखित हैं:
ईसीबी सीटीआर, सीबीसी, जीसीएम
सूचीबद्ध लोगों के बाहर अन्य मोड मौजूद हैं और मौजूदा समस्याओं को सुधारने के लिए शोधकर्ता हमेशा नए मोड की ओर काम कर रहे हैं।
अब चलो कार्यान्वयन पर चलते हैं और क्या सुरक्षित है। कभी भी ईसीबी का उपयोग न करें यह दोहराए जाने वाले डेटा को छिपाने के लिए बुरा है जैसा कि प्रसिद्ध लिनक्स पेंगुइन द्वारा दिखाया गया है ।
जावा में लागू करते समय, ध्यान दें कि यदि आप निम्नलिखित कोड का उपयोग करते हैं, तो ईसीबी मोड डिफ़ॉल्ट रूप से सेट किया गया है:
Cipher cipher = Cipher.getInstance("AES");
... यह एक जीवंतता है! और दुर्भाग्य से, यह सब StackOverflow और ऑनलाइन ट्यूटोरियल और उदाहरणों में देखा जाता है।
Nonces और IVs
ईसीबी मोड के साथ पाए गए मुद्दे के जवाब में आईवीएस के रूप में भी जाना जाता है। विचार यह है कि हम एक नया यादृच्छिक चर उत्पन्न करते हैं और इसे हर एन्क्रिप्शन में संलग्न करते हैं ताकि जब आप दो संदेश एन्क्रिप्ट करें जो समान हों तो वे अलग-अलग हों। इसके पीछे सौंदर्य यह है कि एक IV या गैर-ज्ञान सार्वजनिक ज्ञान है। इसका मतलब है कि एक हमलावर के पास इसका उपयोग हो सकता है लेकिन जब तक उनके पास आपकी चाबी नहीं होगी, वे उस ज्ञान के साथ कुछ भी नहीं कर सकते।
सामान्य मुद्दे जो मैं देखूंगा वह यह है कि लोग IV को एक स्थिर मूल्य के रूप में सेट करेंगे जो उनके कोड में समान निश्चित मूल्य के रूप में होगा। और यहाँ आईवीएस के लिए नुकसान है जिस क्षण आप दोहराते हैं कि आप वास्तव में अपने एन्क्रिप्शन की पूरी सुरक्षा से समझौता करते हैं।
एक यादृच्छिक IV उत्पन्न करना
SecureRandom randomSecureRandom = SecureRandom.getInstance("SHA1PRNG");
byte[] iv = new byte[cipher.getBlockSize()];
randomSecureRandom.nextBytes(iv);
IvParameterSpec ivParams = new IvParameterSpec(iv);
नोट: SHA1 टूट गया है, लेकिन मुझे पता नहीं है कि इस उपयोग के मामले में SHA256 को ठीक से कैसे लागू किया जाए, इसलिए यदि कोई इस पर एक दरार लेना चाहता है और इसे अपडेट करना चाहता है तो यह बहुत बढ़िया होगा! इसके अलावा SHA1 हमले अभी भी अपरंपरागत हैं क्योंकि यह दरार करने के लिए एक विशाल क्लस्टर पर कुछ साल लग सकते हैं। यहां विवरण देखें।
CTR कार्यान्वयन
सीटीआर मोड के लिए कोई पेडिंग आवश्यक नहीं है।
Cipher cipher = Cipher.getInstance("AES/CTR/NoPadding");
CBC कार्यान्वयन
यदि आप CBC मोड को कार्यान्वित करना चुनते हैं तो PKCS7Padding इस प्रकार है:
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS7Padding");
सीबीसी और सीटीआर भेद्यता और आपको जीसीएम का उपयोग क्यों करना चाहिए
हालाँकि कुछ अन्य मोड जैसे कि CBC और CTR सुरक्षित हैं, वे उस मुद्दे पर चलते हैं जहाँ एक हमलावर एन्क्रिप्टेड डेटा को फ्लिप कर सकता है, डिक्रिप्ट होने पर उसका मूल्य बदल सकता है। तो मान लें कि आप एक काल्पनिक बैंक संदेश "सेल 100" को एन्क्रिप्ट करते हैं, आपका एन्क्रिप्टेड संदेश इस तरह का दिखता है "eu23ng" हमलावर एक बिट को "eu53ng" में बदल देता है और अचानक जब आपके संदेश को डिक्रिप्ट किया जाता है, तो यह "900 नंबर" के रूप में पढ़ता है।
इससे बचने के लिए अधिकांश इंटरनेट GCM का उपयोग करता है, और हर बार जब आप HTTPS देखते हैं तो वे शायद GCM का उपयोग कर रहे हैं। GCM एन्क्रिप्टेड संदेश को हैश के साथ हस्ताक्षर करता है और यह सत्यापित करने के लिए जांचता है कि इस हस्ताक्षर का उपयोग करके संदेश को बदला नहीं गया है।
मैं इसकी जटिलता के कारण GCM को लागू करने से बचूंगा। आप Googles की नई लाइब्रेरी Tink का उपयोग करने से बेहतर हैं क्योंकि यहाँ पर यदि आप गलती से एक IV दोहराते हैं तो आप GCM के मामले में कुंजी से समझौता कर रहे हैं, जो कि अंतिम सुरक्षा दोष है। नए शोधकर्ता IV रिपीट प्रतिरोधी एन्क्रिप्शन मोड की दिशा में काम कर रहे हैं जहां आप IV को दोहराने पर भी खतरे में नहीं हैं, लेकिन इसके लिए मुख्यधारा में आना अभी बाकी है।
अब यदि आप GCM को लागू करना चाहते हैं, तो यहाँ एक अच्छा GCM कार्यान्वयन का लिंक दिया गया है । हालाँकि, मैं सुरक्षा को सुनिश्चित नहीं कर सकता या यदि इसका सही तरीके से क्रियान्वयन किया जाता है, लेकिन इसे आधार मिलता है। GCM के साथ भी ध्यान दें कि कोई पैडिंग नहीं है।
Cipher cipher = Cipher.getInstance("AES/GCM/NoPadding");
कुंजी बनाम पासवर्ड
एक और बहुत ही महत्वपूर्ण नोट, यह है कि जब यह एक कुंजी और एक पासवर्ड क्रिप्टोग्राफी की बात आती है तो वही चीजें नहीं हैं। क्रिप्टोग्राफी में एक कुंजी को एक निश्चित मात्रा में एन्ट्रापी और यादृच्छिकता को सुरक्षित माना जाना चाहिए। यही कारण है कि आपको अपने लिए कुंजी बनाने के लिए उचित क्रिप्टोग्राफ़िक लाइब्रेरी का उपयोग करना सुनिश्चित करना होगा।
तो आपके पास वास्तव में दो कार्यान्वयन हैं जो आप यहां कर सकते हैं, पहला यह है कि रैंडम चेंजेशन के लिए इस स्टैकऑवरफ्लो थ्रेड पर पाए गए कोड का उपयोग करें । यह समाधान खरोंच से एक कुंजी बनाने के लिए एक सुरक्षित यादृच्छिक संख्या जनरेटर का उपयोग करता है जिसे आप उपयोग कर सकते हैं।
अन्य कम सुरक्षित विकल्प का उपयोग करना है, उपयोगकर्ता इनपुट जैसे पासवर्ड। जैसा कि हमने चर्चा की है कि पासवर्ड पर्याप्त एन्ट्रापी नहीं है, इसलिए हमें PBKDF2 का उपयोग करना होगा , एक एल्गोरिदम जो पासवर्ड लेता है और इसे मजबूत करता है। यहाँ एक StackOverflow कार्यान्वयन है जो मुझे पसंद आया । हालाँकि Google Tink लाइब्रेरी में यह सब बनाया गया है और आपको इसका लाभ उठाना चाहिए।
Android डेवलपर्स
यहाँ इंगित करने के लिए एक महत्वपूर्ण बिंदु यह है कि आपका एंड्रॉइड कोड रिवर्स इंजीनियर है और अधिकांश मामलों में जावा कोड बहुत अधिक है। इसका मतलब है कि यदि आप अपने कोड में सादे पाठ में पासवर्ड संग्रहीत करते हैं। एक हैकर इसे आसानी से प्राप्त कर सकता है। आमतौर पर, इस प्रकार के एन्क्रिप्शन के लिए, आप असममित क्रिप्टोग्राफी और इतने पर उपयोग करना चाहते हैं। यह इस पद के दायरे से बाहर है इसलिए मैं इसमें गोता लगाने से बचूंगा।
2013 से एक दिलचस्प पढ़ना : इंगित करता है कि एंड्रॉइड में क्रिप्टो कार्यान्वयन के 88% अनुचित तरीके से किए गए थे।
अंतिम विचार
एक बार फिर मैं सुझाव दूंगा कि क्रिप्टो के लिए जावा लाइब्रेरी को सीधे लागू करने से बचें और Google टिंक का उपयोग करें , यह आपको सिरदर्द से बचाएगा क्योंकि उन्होंने सभी एल्गोरिदम को ठीक से लागू करने का वास्तव में अच्छा काम किया है। और फिर भी सुनिश्चित करें कि आप टिंकथ गीथब पर लाए गए मुद्दों की जांच करते हैं, कमजोरियों को यहां और वहां पॉपअप करते हैं।
यदि आपके पास कोई प्रश्न या प्रतिक्रिया है तो टिप्पणी करने के लिए स्वतंत्र महसूस करें! सुरक्षा हमेशा बदल रही है और आपको इसे बनाए रखने के लिए अपना सर्वश्रेष्ठ करने की आवश्यकता है :)