এই সমস্যাটির জন্য বেশ কয়েকটি সাধারণভাবে উদ্ধৃত সমাধান রয়েছে। দুর্ভাগ্যক্রমে এগুলির উভয়ই সম্পূর্ণ সন্তোষজনক নয়:
- সীমাহীন শক্তি নীতি ফাইল ইনস্টল করুন । যদিও এটি সম্ভবত আপনার বিকাশের ওয়ার্কস্টেশনের সঠিক সমাধান, এটি অ-প্রযুক্তি ব্যবহারকারীদের প্রতিটি কম্পিউটারে ফাইল ইনস্টল করার জন্য এটি দ্রুত একটি বড় ঝামেলা হয়ে দাঁড়ায় (রোডব্লক না হলে)। নেই কোন উপায় আপনার প্রোগ্রাম ফাইল বিতরণ করার; এগুলি অবশ্যই জেআরই ডিরেক্টরিতে ইনস্টল করা উচিত (যা অনুমতিগুলির কারণে এমনকি পঠনযোগ্যও হতে পারে)।
- জেসিই এপিআই এড়িয়ে যান এবং বুন্সি ক্যাসলের মতো আরও একটি ক্রিপ্টোগ্রাফি লাইব্রেরি ব্যবহার করুন । এই পদ্ধতির জন্য অতিরিক্ত 1MB গ্রন্থাগার প্রয়োজন, যা প্রয়োগের উপর নির্ভর করে একটি উল্লেখযোগ্য বোঝা হতে পারে। এটি স্ট্যান্ডার্ড লাইব্রেরিতে অন্তর্ভুক্ত কার্যকারিতার সদৃশ করতে বোকা বোধ করে। স্পষ্টতই, এপিআইও সাধারণ জেসিই ইন্টারফেসের থেকে সম্পূর্ণ আলাদা। (বিসি একটি জেসিই সরবরাহকারী বাস্তবায়ন করে, তবে এটি কার্যকর হয় না কারণ বাস্তবায়নের হাতে দেওয়ার আগে কী শক্তি সীমাবদ্ধতা প্রয়োগ করা হয়)) এই সমাধানটি আপনাকে 256-বিট টিএলএস (এসএসএল) সাইফার স্যুট ব্যবহার করতে দেয় না কারণ স্ট্যান্ডার্ড টিএলএস লাইব্রেরিগুলি কোনও সীমাবদ্ধতা নির্ধারণের জন্য অভ্যন্তরীণভাবে জেসিইকে কল করে।
কিন্তু তারপরে প্রতিবিম্ব আছে। প্রতিবিম্ব ব্যবহার করে আপনি করতে পারবেন না এমন কিছু আছে কি?
private static void removeCryptographyRestrictions() {
if (!isRestrictedCryptography()) {
logger.fine("Cryptography restrictions removal not needed");
return;
}
try {
/*
* Do the following, but with reflection to bypass access checks:
*
* JceSecurity.isRestricted = false;
* JceSecurity.defaultPolicy.perms.clear();
* JceSecurity.defaultPolicy.add(CryptoAllPermission.INSTANCE);
*/
final Class<?> jceSecurity = Class.forName("javax.crypto.JceSecurity");
final Class<?> cryptoPermissions = Class.forName("javax.crypto.CryptoPermissions");
final Class<?> cryptoAllPermission = Class.forName("javax.crypto.CryptoAllPermission");
final Field isRestrictedField = jceSecurity.getDeclaredField("isRestricted");
isRestrictedField.setAccessible(true);
final Field modifiersField = Field.class.getDeclaredField("modifiers");
modifiersField.setAccessible(true);
modifiersField.setInt(isRestrictedField, isRestrictedField.getModifiers() & ~Modifier.FINAL);
isRestrictedField.set(null, false);
final Field defaultPolicyField = jceSecurity.getDeclaredField("defaultPolicy");
defaultPolicyField.setAccessible(true);
final PermissionCollection defaultPolicy = (PermissionCollection) defaultPolicyField.get(null);
final Field perms = cryptoPermissions.getDeclaredField("perms");
perms.setAccessible(true);
((Map<?, ?>) perms.get(defaultPolicy)).clear();
final Field instance = cryptoAllPermission.getDeclaredField("INSTANCE");
instance.setAccessible(true);
defaultPolicy.add((Permission) instance.get(null));
logger.fine("Successfully removed cryptography restrictions");
} catch (final Exception e) {
logger.log(Level.WARNING, "Failed to remove cryptography restrictions", e);
}
}
private static boolean isRestrictedCryptography() {
// This matches Oracle Java 7 and 8, but not Java 9 or OpenJDK.
final String name = System.getProperty("java.runtime.name");
final String ver = System.getProperty("java.version");
return name != null && name.equals("Java(TM) SE Runtime Environment")
&& ver != null && (ver.startsWith("1.7") || ver.startsWith("1.8"));
}
removeCryptographyRestrictions()
কোনও স্ট্রিটোগ্রাফিক ক্রিয়াকলাপ সম্পাদনের আগে কেবল কোনও স্ট্যাটিক ইনিশিয়ালাইজার বা এ জাতীয় কল করুন ।
JceSecurity.isRestricted = false
অংশ যে সব সরাসরি 256-বিট সাইফারগুলির ব্যবহার করা প্রয়োজন হয়; তবে, অন্য দুটি অপারেশন ছাড়াই, Cipher.getMaxAllowedKeyLength()
এখনও 128 প্রতিবেদন করা থাকবে, এবং 256-বিট টিএলএস সাইফার স্যুট কাজ করবে না।
এই কোডটি ওরাকল জাভা 7 এবং 8 এ কাজ করে এবং স্বয়ংক্রিয়ভাবে জাভা 9 এবং ওপেনজেডিকে প্রক্রিয়াটি এড়িয়ে যায় যেখানে এটির প্রয়োজন নেই। সর্বোপরি কুৎসিত হ্যাক হওয়ার কারণে এটি অন্যান্য বিক্রেতাদের ভিএমগুলিতে সম্ভবত কাজ করে না।
এটি ওরাকল জাভা 6 তেও কাজ করে না, কারণ ব্যক্তিগত জেসিই ক্লাসগুলি সেখানে আবদ্ধ। আপত্তি যদিও সংস্করণ থেকে সংস্করণে পরিবর্তিত হয় না, তাই জাভা 6 সমর্থন করা এখনও প্রযুক্তিগতভাবে সম্ভব।