শেয়ার করুন 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 বিটে হ্রাস করা যেতে পারে, যা এখনও "শক্তিশালী" এনক্রিপশন হিসাবে বিবেচিত হয়, তবে আক্রমণগুলি এএসকে দুর্বল করে এমন সন্ধান পেলে এটি কোনও সুরক্ষা মার্জিন দেয় না।
যথাযথ ব্লক-চেইনিং মোডের সাথে ব্যবহার করা, একই উত্পন্ন কীটি অনেক বার্তাকে এনক্রিপ্ট করতে ব্যবহার করা যেতে পারে। ইন সাইফার ব্লক চেইনিং (সিবিসি) , একটি র্যান্ডম আরম্ভের ভেক্টর (চতুর্থ) প্রতিটি বার্তার জন্য উৎপন্ন হয়, বিভিন্ন সাইফার টেক্সট এমনকি যদি প্লেইন টেক্সট অভিন্ন মেনে নেওয়া। সিবিসি আপনার কাছে উপলব্ধ সবচেয়ে সুরক্ষিত মোড নাও হতে পারে (নীচে 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 এআইএডি সাইফার মোডগুলির জন্য এপিআই সমর্থন অন্তর্ভুক্ত করে , এবং ওপেনজেডিকে এবং ওরাকল বিতরণগুলির সাথে অন্তর্ভুক্ত "সানজেসিই" সরবরাহকারী জাভা ৮ দিয়ে এই শুরুটি কার্যকর করে these এটি তথ্যের অখণ্ডতা পাশাপাশি তাদের গোপনীয়তা রক্ষা করবে।
একটি java.security.InvalidKeyException
বার্তা "অবৈধ কী আকার বা ডিফল্ট পরামিতি" অর্থ যে ক্রিপ্টোগ্রাফি শক্তিতে হয় সীমাবদ্ধ; সীমাহীন শক্তি এখতিয়ার নীতি ফাইলগুলি সঠিক স্থানে নেই। একটি জেডিকে, তাদের নীচে স্থাপন করা উচিত${jdk}/jre/lib/security
সমস্যার বর্ণনার ভিত্তিতে, শোনা যাচ্ছে যে পলিসি ফাইলগুলি সঠিকভাবে ইনস্টল করা হয়নি। সিস্টেমে সহজেই একাধিক জাভা রানটাইম থাকতে পারে; সঠিক অবস্থানটি ব্যবহার হচ্ছে কিনা তা নিশ্চিত করতে ডাবল-চেক করুন।