bel*_*ial 5 java aix cryptography jce
我正在为客户端编写一个新的JCE Provider,因为我需要公开一些自定义Cipher.延长后CipherSpi和ProviderSpi,我准备再建.所以我问客户端他们定位的Java版本.他们回应:
# java -version
java version "1.6.0"
Java(TM) SE Runtime Environment (build pap3260sr9fp2-20110627_03(SR9 FP2)) IBM J9 VM (build 2.4, JRE 1.6.0 IBM J9 2.4 AIX ppc-32 jvmap3260sr9-20110624_85526 (JIT enabled, AOT enabled) J9VM - 20110624_085526 JIT - r9_20101028_17488ifx17
GC - 20101027_AA)
JCL - 20110530_01
#
Run Code Online (Sandbox Code Playgroud)
该死的.所以他们在AIX机器上使用IBM Java 1.6.0.
我编写了大部分定制的JCE提供程序来支持所需的功能(使用如何实现提供程序指南),从包中扩展ProviderSpi和CipherSpi抽象类com.sun.*.我是否需要获取IBM Java JDK并从中扩展抽象类com.ibm.*?或者我可以使用我的Sun-rooted Java代码签名证书来签署我的JCE提供程序JAR,并将其直接放到AIX系统上的正确位置?(其中一个是愚蠢的,但我不知道哪个).
我对JCE/JVM风格知之甚少,不知道我现在是否需要一个基于IBM的Java代码签名证书(如果有的话),或者Sun-rooted签名是否足够?
Oracle (Sun) 和 IBM JRE 都使用彼此的证书来验证提供者签名。因此,如果您有使用 Sun 证书签名的提供商,它将在 IBM JRE 上运行。所以是的 - IBM 根的 Java 代码签名证书存在(CA 存在,即使您在 IBM 内部也几乎不可能获得该证书),但Sun 根的签名就足够了。您的加密提供程序将在 IBM JRE 上运行。您不需要使用任何com.ibm包。此外,可以绕过提供者签名要求:Java HotSpot Cryptographic Provider Signature Verification issues
提供者证书验证由内部 Java 1.6 JCE 类完成。
javax.crypto.SunJCE_b#a(X509Certificate c)javax.crypto.b#a(X509Certificate c)用于验证签名的 CA 证书存储在类文件中。在 Oracle JVM 中作为纯字符串。IBM 做得更聪明 - 证书字符串被模糊化。为了使它们变得清晰,你应该使用这段代码:
final char[] key = {0x5f, 38, 3, 111, 110};
char[] decode(final char[] input) {
final char[] output = new char[input.length];
for (int i = 0; i < output.length; i++) {
output[i] = (char)(input[i] ^ key[i % 5]);
}
return output;
}
Run Code Online (Sandbox Code Playgroud)
所以在IBM Java 1.6中你可以找到CA代码签名证书:
CN = JCE Code Signing CA, OU = Java Software Code Signing, O = Sun Microsystems Inc, L = Palo Alto, S = CA, C = USCN = JCE Code Signing CA, OU = IBM Code Signing, O = IBM Corporation, C = USCN = JCE Code Signing - Framework, OU = IBM Code Signing, O = IBM Corporation, C = US你应该延长java.security.Provider上课时间。例如,com.ibm.crypto.provider.IBMJCE与 IBM JRE 捆绑在一起就可以做到这一点。(据我所知,没有ProviderSpi类。)您也应该使用javax.crypto.CipherSpi类。例如com.ibm.crypto.provider.DESCipher,IBM 提供商就是这么做的。