步骤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 找不到您的算法,则检查上述步骤以确保它们的正确性。
分享到:
相关推荐
Java(TM) Platform SE binary 7.70U I586完整版 Java(TM) Platform SE binary 7.70U I586完整版,JAVA开发必备的SUN公司软件。
Java(TM) Platform SE binar
Java(TM)SE Development Kit6软件及安装说明,包含环境配置说明,保证可用。
Java(TM) EE 8 Specification APIs,即Java(TM) EE 8规范API。本CHM文档是根据由javadoc(1.8.0_144)于2017年9月生成的HTML文档制作而成的,原版英文文档。
The Java TM Programming Language 4th Ken Arnold James Gosling David Holmes 本资源是中文版: 译名Java 程序设计语言
Oracle官方培训文档 Web 2.0 and Java(TM) Web Site Development_sg
这个是我java3年生涯一直用到的一本最好的java中文开发文档。里面有详尽的j2ee的api。每个java开发者必备之书。
帮助你快速查找JAVA函数,更容易学习java语言
java_tm_8.0.660.18
WSL-Ubuntu 下安装Java的安装包及Java的Mysql的jar包
Java(TM) EE 7 Specification APIs
Java入门的学习工具,Java代码编译及运行。
TM v2.0 多国语言版(Java Blog) TM v2.0 多国语言版(Java Blog) TM v2.0 多国语言版(Java Blog) TM v2.0 多国语言版(Java Blog)
JVM是JRE的一部分,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。JVM有自己完善的硬件架构,如处理器、堆栈、寄存器等,还具有相应的指令系统。JVM 的主要工作是解释自己的...
JAVA TM PLATFORM STANDATION EDITION 6 JDK_API_1_6_zh_CN的chm文本 希望对大家有用。
Java 插件10.51.2.13 有许多应用程序和 Web 站点只有在安装 Java 后才能正常工作,而且这样的应用程序和 Web 站点日益增多。Java 快速、安全、可靠。
适合所有windows系统的最新java虚拟机,方便浏览器运行Java小程序
java.net 为实现网络应用程序提供类。 java.nio 定义作为数据容器的缓冲区,并提供其他 NIO 包的概述。 java.nio.channels 定义了各种通道,这些通道表示到能够执行 I/O 操作的实体(如文件和套接字)的连接;定义...