Có một vài giải pháp thường được trích dẫn cho vấn đề này. Rất tiếc, cả hai điều này đều hoàn toàn không thỏa đáng:
- Cài đặt unlimited strength policy files. Mặc dù đây có lẽ là giải pháp phù hợp cho máy trạm phát triển của bạn, nó nhanh chóng trở thành một rắc rối lớn (nếu không phải là rào cản) để người dùng không có kỹ thuật cài đặt các tệp trên mọi máy tính. Có không có cách nào để phân phối tệp với chương trình của bạn; chúng phải được cài đặt trong thư mục JRE (thậm chí có thể chỉ đọc do các điều khoản).
- Bỏ qua API JCE và sử dụng thư viện mã hóa khác như Bouncy Castle. Cách tiếp cận này yêu cầu thêm một thư viện 1MB, có thể là một gánh nặng đáng kể tùy thuộc vào ứng dụng. Nó cũng cảm thấy ngớ ngẩn để nhân đôi chức năng bao gồm trong các thư viện chuẩn. Rõ ràng, API cũng hoàn toàn khác với giao diện JCE thông thường.(BC thực hiện một nhà cung cấp JCE, nhưng điều đó không hiệu quả vì các hạn chế về sức mạnh chính được áp dụng trước khi giao hàng để thực hiện.) Giải pháp này cũng sẽ không cho phép bạn sử dụng bộ mã hóa TLS (SSL) 256 bit, vì các thư viện TLS tiêu chuẩn gọi JCE nội bộ để xác định mọi hạn chế.
Nhưng sau đó có phản ánh. Có điều gì bạn không thể làm khi sử dụng sự phản chiếu không?
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"));
}
Chỉ cần gọi removeCryptographyRestrictions()
từ bộ khởi tạo tĩnh hoặc trước khi thực hiện bất kỳ hoạt động mã hóa nào.
Phần JceSecurity.isRestricted = false
là tất cả những gì cần thiết để sử dụng thuật toán mã hóa 256 bit trực tiếp; tuy nhiên, nếu không có hai hoạt động khác, Cipher.getMaxAllowedKeyLength()
sẽ vẫn tiếp tục báo cáo 128 và các bộ mã hóa TLS 256 bit sẽ không hoạt động.
Mã này hoạt động trên Oracle Java 7 và 8 và tự động bỏ qua quá trình trên Java 9 và OpenJDK ở nơi không cần thiết. Là một hack xấu xí sau khi tất cả, nó có khả năng không hoạt động trên máy ảo của các nhà cung cấp khác.
Nó cũng không hoạt động trên Oracle Java 6, bởi vì các lớp JCE riêng được obfuscated ở đó. Obfuscation không thay đổi từ phiên bản lên phiên bản mặc dù, vì vậy nó vẫn còn về mặt kỹ thuật có thể để hỗ trợ Java 6.
Hãy xem ở đây: http://docs.oracle.com/javase/1.5.0/docs/guide/security/jce/JCERefGuide.html#ExemptApps –
Tham khảo [Làm thế nào để cài đặt Các tập tin chính sách về quyền lực pháp lý không hạn chế của Java] (http://opensourceforgeeks.blogspot.in/2014/09/how-to-install-java-cryptography.html) –
Tôi nghi ngờ ý định của Sun/Oracle là khách hàng sẽ sử dụng mật mã ít an toàn hơn để NSA có thể truy cập vào kết nối. Tôi không nói đùa hay hoang tưởng, nhưng mật mã được coi là vũ khí và có [lệnh cấm xuất khẩu trên mã hóa chia sẻ] (https://en.wikipedia.org/wiki/Export_of_cryptography_from_the_United_States). – ArtB