5

我正在为客户编写一个新的 JCE 提供程序,因为我需要公开一些自定义密码。扩展CipherSpiand后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
#

该死。所以他们在 AIX 机器上使用 IBM Java 1.6.0。

我已经编写了大部分定制的 JCE 提供程序来支持所需的功能(使用如何实现提供程序指南),从包中扩展ProviderSpiCipherSpi抽象类。com.sun.*我是否需要获取 IBM Java JDK 并扩展抽象类com.ibm.*?或者我是否可以使用我的 Sun 根 Java 代码签名证书对我的 JCE 提供程序 JAR 进行签名,然后将其直接放入 AIX 系统上的正确位置?(其中一个是愚蠢的,但我不知道是哪个)。

我只是不太了解 JCE / JVM 风格,不知道我现在是否需要基于 IBM 的 Java 代码签名证书(如果甚至存在的话),或者基于 Sun 的签名是否足够?

4

1 回答 1

4

Oracle (Sun) 和 IBM JRE 都使用彼此的证书来验证提供者签名。因此,如果您使用 Sun 的证书签署了提供商,它将在 IBM JRE 上运行。所以是的 - 存在基于 IBM 的 Java 代码签名证书(存在 CA,即使您在 IBM 内部也几乎不可能获得证书),但是基于 Sun 的签名就足够了。您的加密提供程序将在 IBM JRE 上工作。你不需要使用任何com.ibm包。此外,可以绕过提供者签名要求:Java HotSpot Cryptographic Provider signature verification issue

详细解释

1. 证书

提供者证书验证由内部 Java 1.6 JCE 类完成。

  • 在甲骨文javax.crypto.SunJCE_b#a(X509Certificate c)
  • 在 IBMjavax.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;
}

所以在 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 = US
  • CN = JCE Code Signing CA, OU = IBM Code Signing, O = IBM Corporation, C = US
  • CN = JCE Code Signing - Framework, OU = IBM Code Signing, O = IBM Corporation, C = US

2. 基础提供者类

你应该扩展java.security.Provider类。例如com.ibm.crypto.provider.IBMJCE,与 IBM JRE 捆绑在一起就可以了。(AFAIK 没有ProviderSpi类。)你也应该使用javax.crypto.CipherSpi类。例如com.ibm.crypto.provider.DESCipher,来自 IBM 供应商的就是这样做的。

于 2013-06-20T17:39:24.457 回答