JCA(Java密码学架构)中的密码服务提供者

2023年2月27日10:01:00JCA(Java密码学架构)中的密码服务提供者已关闭评论

JCA引入了CSP的概念。CSP是JCA的密码服务提供者,包含一个或多个签名算法、消息摘要算法、密钥产生算法、密钥工厂、密钥库创建与密钥管理、算法参数管理、算法参数产生、证书工厂等。

在JDK的典型安装中,安装了一个或者几个提供器程序包。用户可以通过静态或动态的方式添加新的提供器,每一个提供器以唯一的名称被引用。用户可以用不同的提供器来配置自己的运行时间,并指定优先级次序。JCA提供了一套API,允许用户查询安装了哪些提供器以及它们所提供的服务,如果一个应用程序要求某个指定提供器,那么仅从提供器中返回对象。如果指定的提供器不存在,那么只能使用默认的提供器。

当多个提供器同时可用时,将建立一个优先级次序。这个次序也是查找请求服务的次序。当最高级提供器中没有提供请求服务时,可以依照优先级次序查询下一个提供器。

例如,先假设在JVM(Java虚拟机)环境中安装了两个提供器(Provider1和Provider2),再进一步假设Provider1实现带有DSASHA1和MD5的算法,而Provider2实现带有DSASHA1、RSAMD5及MD5的算法。

如果Provider1的优先级次序是1(最高优先级)、Provider2的优先级次序是2,那么有可能遇到下面几种情况:

(1)如果想实现MD5,那么两个提供器都会提供这样的实现。由于Provider1拥有最高优先级,因此最先被查找到,从而返回Provider1的实现。

(2)如果想实现RSAMD5,就会优先查找Provider1,但没有发现这样的实现,于是依序查找Provider2,从而实现被发现并返回。

(3)如果想实现RSASHA1(两个提供器都没有安装该实现),就会提示NoSuchAlgorithmException异常。

服务类以一种抽象方式定义密码服务,而且没有具体的实现。密码服务总是与特定的算法相关联,可以提供下列实现:

(1)密码操作(如数字签名和消息摘要)。

(2)密码操作所需的加密材料(密钥和参数)。

(3)数据对象(密钥库和证书),以一种安全方式压缩用于加密操作的密钥。

比如,DSA密钥工厂通过调用DSASignature对象中的initSign或initVerify方法提供DSA公钥或私钥。

程序员可以请求并使用服务类的实例,执行相应的操作。在JCA中定义服务类:

  • MessageDigest:用来记录指定数据的消息摘要。
  • Signature:签署数据并验证数字签名。
  • KeyPairGenerator:产生与指定算法相匹配的公钥和私钥。
  • KeyFacotry:将类型为Key的模糊密钥转换为清晰密钥,反之亦然。
  • CertificateFacotry:创建公钥证书和CRL。
  • Keystore:创建和管理密钥库。
  • Algorithm Parameter:管理特定算法的参数,包括参数的编码和解码。
  • Algorithm Parameter Generator:产生与指定算法相匹配的一系列参数。
  • SecureRandom:产生随机或伪随机数。

在JCA语境中,产生器和工厂的不同点在于前者以新的内容创建一个对象,后者从已有材料(如编码)中创建对象。

服务类为指定类型的密码服务的功能提供了接口,这种服务独立于特定的加密算法API,使应用程序能够访问指定的加密服务。对于一个或多个提供器,真正实现的是它们各自的算法。

服务类提供的应用程序接口由SPI(服务提供器接口)实现。也就是说,对于每一个服务类,都有一个抽象SPI类,由它来定义密码服务提供器必须实现的SPI方法。例如,Signature服务类提供访问DSA功能的服务,由SignatureSpi子类提供的真正实现将针对指定类型的签名算法,如带有DSA SHA1、RSA SHA1或RSA MD5。

每个SPI类的名字与相应的服务类名字相一致。例如,与Signature服务类对应的SPI类的名称是SignatureSpi。SPI类是抽象类。对于一个指定的算法来说,为了提供一个特殊类型服务的实现,提供器必须使相应的SPI类成为子类,并为所有的抽象方法提供实现。

另一个服务类的例子是MessageDigest类,提供访问消息摘要算法。在MessageDigestSpi子类中,它的实现实质上是各种消息摘要算法,如SHA-1、MD5或MD2.

最后一个例子是Keyfactory服务类,提供从模糊密钥到清晰密钥类型的转换。在KeyfactorySpi子类中,真正实现的是密钥的指定类型,如DSA公钥和私钥。

JCA CSP提供各种密码服务实现,如SUN。提供器也可以实现不可用的服务,例如基于RSA的签名算法或者MD2消息摘要算法。

假如你是一个用户,为了得到一个合适的对象,如Signature对象,可以用Signature类中的getInstance方法,并指定一个签名算法(如带有DSA SHA1)和能提供所需实现的提供器,例如政府机关可能需要接收政府验证的实现。

如果想要使用的提供器没有安装,那么即使在其他已安装的提供器中包含所需的实现算法,也会出现NoSuchProviderException异常,所以必须安装所需要的提供器。这就涉及安装和配置提供器程序包的问题。可以采用以下两种方法安装提供器类:

(1)将包含提供器类的ZIP和JAR文件放在CLASSPATH下。

(2)将提供器JAR文件作为已安装和绑定的文件扩展。

下一步,可以用动态或静态的方法将提供器添加到已批准的提供器列表中。如果要在静态条件下实现这一点,就可以编辑Java安全属性文件,设置的一个属性是security.provider.n=masterClassName。

这一设置定义了一个提供器,并指定了它的优先级次序n。提供器优先级次序也就是査找请求算法的次序。

masterClassName指定提供器的主类(master class),这一点在提供器的资源文件中设置,此类总是Provider类的子类。它的构造器设置各种属性。在JCA的API中,提供器通过属性查找请求的算法和其他设施。假设主类是COM.abcd.provider.Abcd,为了将Abcd的优先级设置为3,可以在安全属性文件中加入一行:

    security.provider.3=COM.abcd.provider.Abcd

也可以在Security类中通过调用addProvider或insertProviderAt方法动态地注册提供器。注册类型也不是一成不变的,但只能由被赋予充足许可权的可信程序来完成。

  • A+
所属分类:JAVA
  • 版权声明:本篇文章(包括图片)来自网络,由程序自动采集,著作权(版权)归原作者所有,如有侵权联系我们删除,联系方式(QQ:452038415)。