शेयर password
(ए char[]
) और salt
(एक byte[]
-8 बाइट्स SecureRandom
जो एक अच्छा नमक बनाता है - जिसे गुप्त रखने की जरूरत नहीं है) द्वारा प्राप्तकर्ता आउट-ऑफ-बैंड के साथ साझा करें। फिर इस जानकारी से एक अच्छी कुंजी प्राप्त करने के लिए:
/* Derive the key, given password and salt. */
SecretKeyFactory factory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA256");
KeySpec spec = new PBEKeySpec(password, salt, 65536, 256);
SecretKey tmp = factory.generateSecret(spec);
SecretKey secret = new SecretKeySpec(tmp.getEncoded(), "AES");
मैजिक नंबर (जिसे कहीं भी स्थिरांक के रूप में परिभाषित किया जा सकता है) क्रमशः 65536 और 256 प्रमुख व्युत्पत्ति पुनरावृत्ति गणना और प्रमुख आकार हैं।
मुख्य व्युत्पत्ति समारोह महत्वपूर्ण कम्प्यूटेशनल प्रयास की आवश्यकता के लिए प्रसारित होता है, और यह हमलावरों को कई अलग-अलग पासवर्डों को जल्दी से आज़माने से रोकता है। उपलब्ध कंप्यूटिंग संसाधनों के आधार पर पुनरावृति गणना को बदला जा सकता है।
मुख्य आकार को 128 बिट तक कम किया जा सकता है, जिसे अभी भी "मजबूत" एन्क्रिप्शन माना जाता है, लेकिन यह सुरक्षा के मार्जिन को बहुत अधिक नहीं देता है अगर हमलों की खोज की जाती है जो एईएस को कमजोर करता है।
एक उचित ब्लॉक-चेनिंग मोड के साथ उपयोग किया जाता है, एक ही व्युत्पन्न कुंजी का उपयोग कई संदेशों को एन्क्रिप्ट करने के लिए किया जा सकता है। में सिफ़र ब्लॉक Chaining (सीबीसी) , एक यादृच्छिक आरंभीकरण वेक्टर (चतुर्थ) प्रत्येक संदेश के लिए उत्पन्न होता है, अलग अलग सिफर पाठ भले ही सादे पाठ समान है उपज। CBC आपके लिए सबसे सुरक्षित मोड उपलब्ध नहीं हो सकता है (नीचे AEAD देखें); विभिन्न सुरक्षा गुणों के साथ कई अन्य मोड हैं, लेकिन वे सभी एक समान यादृच्छिक इनपुट का उपयोग करते हैं। किसी भी स्थिति में, प्रत्येक एन्क्रिप्शन ऑपरेशन के आउटपुट सिफर टेक्स्ट और इनिशियलाइज़ेशन वेक्टर हैं:
/* Encrypt the message. */
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
cipher.init(Cipher.ENCRYPT_MODE, secret);
AlgorithmParameters params = cipher.getParameters();
byte[] iv = params.getParameterSpec(IvParameterSpec.class).getIV();
byte[] ciphertext = cipher.doFinal("Hello, World!".getBytes("UTF-8"));
ciphertext
और स्टोर करें iv
। डिक्रिप्शन पर, एक SecretKey
ही नमक और पुनरावृत्ति मापदंडों के साथ पासवर्ड का उपयोग करके, उसी तरह से पुनर्जीवित किया जाता है। इस कुंजी और संदेश के साथ संग्रहीत आरंभीकरण वेक्टर के साथ सिफर को प्रारंभ करें :
/* Decrypt the message, given derived key and initialization vector. */
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
cipher.init(Cipher.DECRYPT_MODE, secret, new IvParameterSpec(iv));
String plaintext = new String(cipher.doFinal(ciphertext), "UTF-8");
System.out.println(plaintext);
जावा 7 में AEAD सिफर मोड के लिए एपीआई समर्थन शामिल है , और OpenJDK और Oracle वितरण के साथ शामिल "SunJCE" प्रदाता इन शुरुआत जावा के साथ लागू करता है। इनमें से एक मोड CBC के स्थान पर दृढ़ता से अनुशंसित है; यह डेटा की अखंडता और साथ ही उनकी गोपनीयता की रक्षा करेगा।
एक java.security.InvalidKeyException
संदेश "अवैध कुंजी आकार या डिफ़ॉल्ट पैरामीटर" का मतलब है कि क्रिप्टोग्राफी शक्ति के साथ है ही सीमित; असीमित ताकत अधिकार क्षेत्र की नीति की फाइलें सही स्थान पर नहीं हैं। एक जेडीके में, उन्हें नीचे रखा जाना चाहिए${jdk}/jre/lib/security
समस्या वर्णन के आधार पर, ऐसा लगता है कि नीति फ़ाइलें सही तरीके से स्थापित नहीं हैं। सिस्टम में आसानी से कई जावा रनटाइम हो सकते हैं; यह सुनिश्चित करने के लिए डबल-चेक करें कि सही स्थान का उपयोग किया जा रहा है।