`
jskjdxxqt
  • 浏览: 3782 次
  • 性别: Icon_minigender_1
  • 来自: 无锡
社区版块
存档分类
最新评论

如何为Java TM 密码体系结构实现Provider

阅读更多
步骤1: 编写服务实现程式码

首先要做的是编写程式码,以对所要支援的密码服务提供特定于算法的实现。
在JDK 1.2 中,用户可以提供签名、报文摘要、密钥对产生和(伪)随机数产生算法,也可以提供密钥、证书工厂和密钥仓库的创建与管理,算法参数管理及算法参数产生等服务。

对于每项密码服务,均必须创建相应SPI类的子类:SignatureSpi、MessageDigestSpi、KeyPairGeneratorSpi、SecureRandomSpi、AlgorithmParameterGeneratorSpi、AlgorithmParametersSpi、KeyFactorySpi、CertificateFactorySpi或KeyStoreSpi

在子类中,您需要:

提供抽像方法的实现,其名字通常以“engine”开头。
确保有不带任何参数的公用构造函数。 原因如下:当某一服务被请求时,JDK Security将查找实现该服务的子类,它是被“主类”中的属性指定的(参见 步骤3 )。 然后,JDK Security即创建同子类相关的类对像,并通过调用该类对像中的 newInstance 方法来创建该子类的实例。newInstance 方法需要子类具有一个不带任何参数的公用构造函数。

如果子类没有任何构造函数,则将自动创建预设不带参数的构造函数。 但如果子类已定义了构造函数,则必须显式地定义不带参数的公用构造函数。

步骤2: 命名Provider

请为提供者命名。 客户应用程式可利用该名字引用您的provider。

步骤3: 编写“主类”(Provider 的子类)

第三步需要创建Provider 类的子类。
子类应该是 final 类,其构造函数应该
调用 super ,指定提供者名(参见 步骤2 )、版本号和它所支援的提供者和算法的字符串资讯。 例如:
    super("ACME", 1.0, "ACME provider v1.0, implementing " + "RSA signing and key generation, SHA-1 and MD5 message digests.");
设置JDK 安全API 查找provider 实现的密码服务所需的各种属性值。 对于每个provider 实现的服务,都必须有一个属性,并且该属性名应为服务(Signature、MessageDigest、KeyPairGenerator、SecureRandom、KeyFactory、KeyStore、CertificateFactory、AlgorithmParameterGenerator 或AlgorithmParameters)型态的,后面跟着句号和该服务支援的算法、证书型态或密钥仓库型态。 该属性值必须指定实现该服务的类的完整名字。

下表说明了必须为各种服务型态定义的属性的各种型态(实际的算法名用 algName 代替,证书型态用 certType 代替,密钥仓库型态用 storeType 代替):


    Signature. algName
    MessageDigest. algName
    KeyPairGenerator. algName
    SecureRandom. algName
    KeyFactory. algName
    CertificateFactory. certType
    KeyStore. storeType
    AlgorithmParameterGenerator. algName
    AlgorithmParameters. algName
其中, algName 、 certType 或 storeType 分别是算法、证书型态或密钥仓库型态的“标准”名。每个属性值都必须是实现指定算法、证书型态或密钥仓库型态的类的完整名字。 也就是说,它必须是在包名后紧跟类名,且包名与类名之间以句点分隔。

例如,名为“SUN”的预设提供者在 sun.security.provider 包中名为 DSA 的类中实现了数字签名算法(其标准名为“SHA1withDSA”)。 其提供者的子类( sun.security.provider 包中的 Sun 类)通过如下方法将 Signature.SHA1withDSA 属性的值设置为“sun.security.provider.DSA”:
    put("Signature.SHA1withDSA", "sun.security.provider.DSA")
主类属性设置的其它示例,参见 附录A 以查看当前JDK 1.2 Sun.java 源文件。 它将说明 Sun 类构造函数如何设置“SUN”提供者的所有属性值。
注意:Provider 子类可以从任何地方获取自己的资讯。 因此,该资讯可在程式中硬性编入,也可在运行时获得(例如从文件获得)。

步骤4: 编译程式码

创建完实现程式码( 步骤1 ),为提供者命名( 步骤2 ),然后创建主类( 步骤3 )之后,可以用编译器对文件进行编译。

步骤5: 准备测试:安装Provider

为了准备测试提供者,必须按照要使用它的客户所要采用的方式进行安装。 当客户请求算法实现时,这种安装方式即可帮助JDK Security 找到它们。
安装提供者分为两部分:provider 包类的安装和配置。

安装Provider 类

首先要使类可用,以便需要时能找到它们。 可以按JAR (Java ARchive) 文件或ZIP 文件的形式提供provider 类。
有两种安装provider 类的方法:

将包含有这些类的zip 或JAR 文件放到CLASSPATH 下。
将provider JAR文件作为“已安装”或“已捆绑”的扩展功能来提供。 有关如何发布扩展功能的详细资讯,参见 如何发布扩展功能?。
配置Provider

下一步就是将该提供者添加到被认可的providers列表中。 这可通过编辑JDK的 lib/security (在Windows中为 lib\security )目录下的 java.security 文件来静态完成。 这样,如果JDK安装在 jdk1.2 目录下,则文件为:

jdk1.2/lib/security/java.security (Solaris)
jdk1.2\lib\security\java.security (Windows)
对于每个提供者, 该文件都应有如下形式的声明:
    security.provider. n = masterClassName
该语句声明了一个提供者并指定了它的优先顺序 n 。 优先顺序是当没有请求特定提供者时,为获得请求算法而查找提供者的顺序。 优先顺序是从1开始的:1享有最大优先权,紧接着是2,依此类推。
masterClassName 必须指定提供者的“主类”的完整名,这是在 步骤3 中实现的。 该“主类”始终是Provider类的子类。

安装JDK时,将包括一个内置(预设)提供者,即“SUN”。java.security 文件仅提供如下提供者规范:
    security.provider.1=sun.security.provider.Sun
(记住“SUN”提供者的主类是 sun.security.provider 包中的 Sun 类。)
假定主类是 COM.acme.provider 包中 Acme 类,并且您想使自己的提供者优先顺序为2。 为此,请在 java.security 文件中有关“SUN”提供者的一行下添加如下行:
    security.provider.2=COM.acme.provider.Acme
注意:也可动态注册提供者。 为此,可以编写一个程式(例如 步骤7 中编写的测试程式)调用 Security 类中的 addProvider 方法或 insertProviderAt 方法。 这种型态的注册不是持久的且只能由“可信任”的程式完成。 参见 Java加密体系结构API规范与引用 的 Security 类部分。

步骤6: 编写和编译测试程式

用户可以编写和编译一个或多个测试程式来测试提供者与安全API 的结合及算法的正确性。 为此,需要创建所需的支援文件,例如用于测试将被散列或签名的数据的文件。
程式首先应进行的测试是确保能够发现提供者,并且最好能发现其名字、版本号和附加资讯。 为此,可以编写如下程式码(用您的provider 名来代替“MyPro”名):

    import java.security.*; Provider p = Security.getProvider("MyPro"); System.out.println("MyPro provider name is " + p.getName()); System.out.println("MyPro provider version # is " + p.getVersion()); System.out.println("MyPro provider info is " + p.getInfo());
下一步应确保发现服务。 例如,如果已实现SHA-1 报文摘要算法,则使用如下程式码(仍用您的provider 名代替“MyPro”)即可确保服务在被请求时能被发现:
    MessageDigest sha = MessageDigest.getInstance("SHA", "MyPro"); System.out.println("My MessageDigest algorithm name is " + sha.getAlgorithm());
调用 getInstance 时,如果没有指定提供者名,则将按优先顺序(参见 配置Provider )查找所有注册的提供者,直到发现实现该算法的某个提供者。
步骤7: 运行测试程式

现在可以运行测试程式。 调试程式码后可继续所需的测试。 如果JDK 安全API 找不到您的算法,则检查上述步骤以确保它们的正确性。
0
0
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics