为了正常的体验网站,请在浏览器设置里面开启Javascript功能!

java编程密码学

2011-07-03 24页 pdf 798KB 65阅读

用户头像

is_845480

暂无简介

举报
java编程密码学 下载 第7章 编程密码学 安全是文明社会的主要伪装。 —萧伯纳 前面几章简要地谈到了密码学的一些基本概念,以及代码签名和使用证书等问题,它们 都依赖于公钥加密系统,本章将深入到 J a v a的内部,研究隐藏在A P I和其他工具中的 J a v a密码学 结构( J C A )。 J C A最早出现在 J D K 1 . 1中,只有有限的功能,包括为数字签名和消息摘要而设计的 A P I。 为了增强和发展基于 J a v a平台的密码学功能, J D K 1 . 2,已经有意使 J C A扩展为框架结构。更 ...
java编程密码学
下载 第7章 编程密码学 安全是文明社会的主要伪装。 —萧伯纳 前面几章简要地谈到了密码学的一些基本概念,以及代码签名和使用证书等问题,它们 都依赖于公钥加密系统,本章将深入到 J a v a的内部,研究隐藏在A P I和其他工具中的 J a v a密码学 结构( J C A )。 J C A最早出现在 J D K 1 . 1中,只有有限的功能,包括为数字签名和消息摘要而设计的 A P I。 为了增强和发展基于 J a v a平台的密码学功能, J D K 1 . 2,已经有意使 J C A扩展为框架结构。更 为一般的讲,现在的 J C A包含所有 J D K 1 . 2中与密码有关的安全A P I。例如,新的支持X . 5 0 9v 3 证书的证书管理结构。而且也包括一些提供器结构,允许多种可相互作用的密码学实现,以 及与之相关的规则说明。 从逻辑上讲, J C A包含定义在 J D K 1 . 2和J C E 1 . 2中的密码 A P I,它们为加密 ,密钥交换, M A C (消息鉴别代码) ,以及许多与加密相关的类提供了特性。而 J D K和JCE 联合提供了一套与平 台无关的A P I。现在, J C E作为J D K的一个扩展版本而单独发行,并与美国密码 出口法规保持 一致。本章讨论的结构话题,包含J D K与J C E ,但仅仅集中讨论J D K中与密码相关的界面。 7.1 设计原则 J C A设计应遵循的两个原则: (1) 算法的独立性和可扩展性。 (2) 实现的独立性和相互作用性。 J C A的目的是使A P I的用户建立密码的概念,例如数字签名和消息摘要,而不是去关心如 何实现这些概念,或是用来实现这些概念的算法。与此同时, J C A提供了标准的A P I,使得开 发者能够请求指定的算法和实现。 算法的独立性是通过定义密码服务类 (service classe)来获得的,该类提供了密码算法功能, 例如M e s s a g e D i g e s t,S i g n a t u r e,K e y F a c t o r y类 。 使用基于提供器的结构,可得到实现的独立性。第 4章讨论了提供器的一般概念。在 J C A 中,提供器代密码服务提供器 (Cryptographic Service Provider,C S P )实现一个或多个 J C A密 码服务的一个或一系列程序包,例如数字签名算法、消息摘要程序包、密钥转换服务等。一 个应用程序也许仅需要一个实现特殊服务 (比如D S A签名算法)的特殊类型的对象 (如S i g n a t u r e 对象),并接收来自一个已安装的提供器的实现。如果希望的话,还可以从某个指定的提供器 中实现这个操作。当更快或更安全的版本可用时 ,对应用程序而言 ,提供器会变得更加清晰。 在J D K 1 . 1中,包含一个与平台无关的实现—产生随机数,此操作在一些机器上是无效 的。除此之外,该实现有固定的代码,不能轻易设置。但在 J D K 1 . 2中,可以轻松指定一个自 关于J C E 1 . 2的参考书正在酝酿当中。 118使Java 2平台安全技术—结构、API设计和实现 下载 制的服务,以利用特定操作平台 (例如L i n u x )上好的随机数资源。 考虑到A P I设计的一般性,从某种程度上说,即使是各种实现有不同的特性 ,也可得到实 现的相互作用性。它们可以共同运行,例如,相互使用密钥,相互验证签名。例如,当某个 密钥工厂实现被安装,对于同样的算法,由一个提供器产生的密钥可由另一个提供器使用 .同 样,由一个提供器产生的签名可由其他提供器来验证。即使一个提供器在软件中运行,而另 一个提供器在硬件中运行 ;或一个与平台无关,而另一个与指定的平台相关,这种相互作用性 也可以得到实现。界面设计也可以得到扩展,因为可轻易添加与所支持的服务类相匹配的新 算法。 图7 - 1描述了 J C A结构的大体轮廓。遵循前面提出的两个设计原则, J C A为密码软件市场 带来了巨大的利益。一方面,对于软件开发者来说,可以只关心一套 A P I,而不用理会采用何 种算法,安装哪一种提供器程序包。另一方面,密码工具包,或是数据库可以在智能属性上 (例如已模块化的算法和技术 )达到相互一致,从而使性能得以优化,在 J C A A P I中,可保持各 种实现的完全相互作用性。 图7-1 JCA结构 7.2 密码服务和服务提供器 J C A介绍了C S P的概念。在 J C A 1 . 1中,提供器有一种操作,包含一个或多个签名算法、消 息摘要算法、密钥产生算法。在 J D K 1 . 2中,又增加了五种服务 : • 密钥工厂。 • 密钥库创建与密钥管理。 • 算法参数管理。 • 算法参数产生。 • 证书工厂。 J D K 1 . 2中也提供了一种随机数产生 ( R N G )算法。 在J D K的典型安装中,安装了一个或者几个提供器程序包。用户可以通过静态或动态的 方式,添加新的提供器。每一提供器以唯一的名称被引用。用户可以用不同的提供器来配置 应 用 程 序 自己的运行时间,并指定优先级次序。 J C A提供了一套A P I。允许用户查询安装了哪些提供器 及它们所提供的服务,如果一个应用程序要求一个指定的提供器。那么从提供器中仅返回对 象。如果指定的提供器不存在,那么只能使用缺省的提供器。 当多个提供器同时可用时,那么将建立一个优先级次序。这个次序也是查找请求的服务 的次序。当最高级提供器中没有提供请求服务时,那么将依照优先级次序查询下一个提供器。 例如,假设在你的 J V M环境中已安装了两个提供器: P r o v i d e r 1和P r o v i d e r 2,进一步假设, P r o v i d e r 1实现带有DSA SHA1和M D 5算法,而P r o v i d e r 2实现带有DSA SHA1、RSA MD5 及 M D 5算法。 如果P r o v i d e r 1的优先级次序是 1 (最高优先级 ),P r o v i d e r 2的优先级次序是 2,那么有可能 遇到下面几种情况: (1) 如果你想实现M D 5,两个提供器都提供这样的实现,由于 P r o v i d e r 1拥有最高优先级, 因此最先被查找,所以返回P r o v i d e r 1的实现。 (2) 如果你想实现RSA MD5 ,优先查找P r o v i d e r 1,但没有发现这样的实现,于是依序查 找P r o v i d e r 2,实现被发现并返回。 ( 3 )如果你想实现 RSA SHA1,两个提供器都没有安装该实现,于是出现 N o S u c h A l g o r i t h m E x c e p t i o n。 J a v a运行时间环境S u n版本,提供一个缺省的提供器 S U N,其余的 J a v a运行时间环境没有 必要提供这个S U N提供器。S U N提供器程序包包含下列实现 : • NIST FIPS186中描述的数字签名算法 ( D S A )。 • MD5(RFC 1321)和SHA-1(NIST FIPS180-1)消息摘要算法。 • DSA 密钥对产生器能产生与D S A算法相匹配的公钥与私钥对。 • DSA算法参数产生器。 • DSA 算法参数管理器。 • DSA 密钥工厂,能够在 (不透明的 ) D S A私钥及公钥对象与基本的密钥材料之间,提供一 种双向转换。 • 专有S H A 1 P R N G伪随机数产生算法,该算法出自 IEEE P1363标准建议书。 • X.509证书和C R L的证书工厂。 • 专有密钥库类型 J K S。 服务类以一种抽象方式定义密码服务,而且没有具体的实现,密码服务总是与一特定的 算法相关联,它可以提供下列实现: • 密码操作(如数字签名和消息摘要 )。 • 密码操作所需的加密材料 (密钥和参数 )。 • 数据对象(密钥库和证书),以一种安全方式压缩用于加密操作的密钥。 服务类的一个例子—S i g n a t u r e,提供对 D S A功能的访问。 D S A密钥工厂通过调用 D S A S i g n a t u r e对象中的 i n i t S i g n或i n i t Ve r i t y方法,提供D S A公钥或私钥。 程序员可以请求并使用服务类的实例 ,执行相应的操作, J D K 1 . 2中定义了下列服务类: • MessageDigest:用来记录指定数据的消息摘要。 • Signature:签署数据并验证数字签名。 • KeyPairGenerator : 产生与指定算法相匹配的公钥和私钥 s。 第7章 编程密码学使用119 下载 120使Java 2平台安全技术—结构、API设计和实现 下载 • KeyFactory:将类型为K e y的模糊密钥转换为清晰密钥。反之亦然。 • CertificateFactory:创建公钥证书和C R L。 • KeyStore:创建和管理密钥库 。 • Algorithm Parameter:管理特定算法的参数,包括参数的编码和解码。 • Algorithm Parameter Generator:产生与指定算法相匹配的一系列参数。 • SecureRandom: 产生随机或伪随机数。 在J C A语境中,产生器和工厂的不同点在于前者以新的内容创建一个对象,而后者是从已 有材料(如编码)中创建对象。 服务类为指定类型的密码服务的功能提供了界面,这种服务独立于特定的加密算法。它 定义了A P I,使应用程序能够访问指定的加密服务。对于一个或多个提供器而言,真正的实现 是它们各自的算法。 服务类提供的应用程序界面由 S P I (服务提供器界面 )实现。也就是说,对于每一个服务类, 都有一个抽象S P I类,由它来定义密码服务提供器必须实现的 S P I方法。 例如,S i g n a t u r e服务类提供访问D S A功能的服务,由S i g n a t u r e S p i子类提供的真正 实现将 针对指定类型的签名算法,如带有 DSA SHA1、 RSA SHA1或RSA MD5。 服务类的一个实例—A P I对象(和与之对应的S P I类)—通过调用服务类中的getInstance( ) 方法来创建该实例(作为一个私有域)被压缩对应S P I类和S P I对象的实例。所有A P I对象中的A P I 方法最终都会被声明,并且它们的实现激活了被压缩的 S P I对象中相应的S P I方法(见图7 - 2 )。 图7-2 服务类中的API和SPI 每个S P I类的名字与相应的服务类的名字相一致,例如,与 S i g n a t u r e服务类对应的 S P I类 的名称是Signature Spi。S P I类是抽象类。对于一个指定的算法来说,为了提供一个特殊类型 服务的实现,提供器必须使相应的 S P I类成为子类,并为所有的抽象方法提供实现。 另一个服务类的例子是 M e s s a g e D i g e s t类。它提供访问消息摘要算法。在 M e s s a g e D i g e s t S p i子类中,它的实现实质上是各种消息摘要算法,如 S H A - 1、M D 5或M D 2。 最后一个例子是 K e y F a c t o r y服务类,提供从模糊密钥到清晰密钥类型的转换。在 K e y F a c t o r y S p i子类中,真正的实现是密钥的指定类型,如 D S A公钥和私钥。 JCA CSP提供各种密码服务实现,如 S U N。提供器也可以实现不可用的服务,例如基于 R S A的签名算法或者M D 2消息摘要算法。 安装和添加提供器 假如你是一个用户,为了得到一个合适的对象,如 S i g n a t u r e对象,你可以调用 S i g n a t u r e 类中的g e t I n s t a n c e方法,并指定一个签名算法 (如:带有DSA SHA1)和能提供所需实现的提供器 API类 SPI类 例如,政府机关可能需要接收政府验证的实现。 如果你想使用的提供器没有安装,即使在其他已安装的提供器中包含有所需的实现算法。 那么也会出现N o S u c h P r o v i d e r E x c e p t i o n,所以必须安装所需要的提供器。这就涉及到了安装 和配置提供器程序包的问题。可以采用以下两种方法安装提供器类: • 将包含提供器类的Z I P和J A R文件放在C L A S S PAT H下。 • 将提供器 J A R文件作为已安装和绑定的文件扩展。 下一步,可以用动态或静态的方法将提供器添加到已批准的提供器列表中。如果在静态 条件下实现这一点,可以编辑 J a v a安全属性文件,可以设置的一个属性是 : s e c u r i t y . p r o v i d e r . n = m a s t e r C l a s s N a m e 这一设置定义了一个提供器,并指定了它的优先级次序 n。提供器优先级次序也就是查找 请求的算法的次序。 m a s t e r C l a s s N a m e指定提供器的主类 (master class),这一点在提供器的资源文件中设置, 此类总是P r o v i d e r类的子类。它的构造器设置各种属性,在 J C A的A P I中,提供器通过属性查找 请求的算法和其他设施。假设主类是 C O M . a b c d . p r o v i d e r. A b c d,为了将A b c d的优先级设置为3, 可以在安全属性文件中加入一行: s e c u r i t y . p r o v i d e r . 3 = C O M . a b c d . p r o v i d e r . A b c d 也可以在S e c u r i t y类中,通过调用a d d P r o v i d e r或i n s e r tPr o v i d e r A t方法,动态地注册提供器。 注册类型也不是一成不变的,但只能由被赋予充足许可权的可信程序来完成。例如,下面的 策略表明,只有从本地文件系统中目录 / h o m e / s y s a d m i n /下署名为 J A R文件加载的代码,可以 调用S e c u r i t y类中的方法,实现添加和删除提供器或者设置安全属性。 (通过使用用户密钥库 中别名为s y s a d m i n的公钥 ,来验证 J A R文件的签名 )。 7.3 密码类 本节将讨论 J C A核心类的设计和用法。 7.3.1 java.security.Security S e c u r i t y类管理已安装的提供器和安全方面的属性。它仅包含静态方法,因此不能用具体 的例子来说明。 第7章 编程密码学使用121 下载 122使Java 2平台安全技术—结构、API设计和实现 下载 g e t P r o v i d e r s ( )方法返回一个包含所有已安装提供器的数组,提供器在数组中的次序对应着 它们的优先级次序。 a d d P r o v i d e r方法将一个提供器加到已安装提供器列表的结尾,并返回提 供器的优先级位置值。如果这个提供器已经被安装,那么再次添加是无效的,返回值是- 1。 i n s e r t P r o v i d e r方法在搜索请求算法的提供器中指定一个位置,并插入新的提供器。 (如果 没有指定提供器 )。如果这个提供器已存在,那么不能再次添加。如果给定的提供器安装在指 定的位置,那么原来位于这个位置和优先级小于此位置的提供器依次下移,此方法返回值是 所增加提供器的优先级。如果提供器已存在,那么返回值为- 1。 r e m o v e P r o v i d e r方法删除已命名的提供器,如果已命名的提供器没有安装,那么将返回缺 省值。如果指定的提供器被删除,那么所有优先级低于该提供器的提供器依次上移。如果要改 变某个已安装提供器的优先级位置,应当首先删除它,然后再将其插入到新的优先级位置。 7.3.2 java.security.Provider 每个P r o v i d e r类实例都有自己的名字、版本号及字符串描述和它所提供的服务。可以通过 调用下列方法来查询P r o v i d e r实例: publ ic Str ing getName( ) publ ic double getVersion( ) publ ic Str ing get Info( ) 7.3.3 java.security.MessageDigest M e s s a g e D i g e s t类是一种提供密码安全消息摘要,如 SHA1 MD5功能的服务类。密码安全 消息摘要采用任意长度的输入,然后产生一个固定长度的输出,称为一个摘要或散列。因为 两个不同消息的散列值不可能相同,因此,从消息摘要中不可能得到生成它的输入,故消息 摘要有时又被称为数据的“数字水印”。 为了计算消息摘要,首先应创建一个消息摘要实例,与所有的服务类一样,对于特定类 型的消息摘要算法而言,可通过调用 M e s s a g e D i g e s t类中的g e t I n s t a n c e静态方法得到M e s s s a g e D i g e s t对象: publ ic stat ic MessageDigest get Instance(Str ing algor i thm) 算法名对大小写不敏感,例如,下列调用方法都是相等的 : M e s s a g e D i g e s t . g e t I n s t a n c e ( " S H A " ) M e s s a g e D i g e s t . g e t I n s t a n c e ( " s h a " ) M e s s a g e D i g e s t . g e t I n s t a n c e ( " s H a " ) 调用者可以任意指定提供器名,但必须保证 请求算法的实现出自己命名的提供器 : publ ic stat ic MessageDigest get Instance(Str ing algor i thm,Str ing provider) 调用g e t I n s t a n c e方法,返回一个被初始化的消息摘要对象,因此不需要进一步初始化对象。 下一步,为计算一些数据的摘要,应当向被初始化的消息摘要对象提供数据。这一点可 第7章 编程密码学使用123 下载 通过调用下列已更新的方法来实现。 public void update(byte input) publ ic void update(byte[ ] input) publ ic void update(byte[ ] input, int of fset, int len) 通过调用更新的方法提供数据后,可运用下列摘要方法计算摘要: public byte[ ] digest( ) publ ic byte[ ] d igest(byte[ ] , input ) publ ic int digest(byte[ ] buf , int of fset , int len) 前两个方法返回已计算的摘要,第三个方法将计算得到的摘要存储在提供器的 b u f缓存中, 从o ff s e t开始 , l e n是分配给摘要的字节数。上述方法返回存储在 b u f中的真正字节数。调用以 b y t e数组参数作为输入的摘要方法,等效于在无参数的分类方法调用之后再调用指定输入的 public void updata(byte[] input)。 7.3.4 java.security.Signature S i g n a t u r e类是一种提供密码数字签名算法,如 DSA SHA1和RSA MD5功能的服务类。密 码安全性签名算法,采用任意长度数据和私钥作为输入,产生一个固定长度的字符串—签 名,签名具有下列属性: (1) 当提供与产生签名的私钥相应的公钥时,就可以验证输入的可靠性和完整性。 (2) 签名和公钥不能揭露任何私钥信息。 S i g n a t u r e对象可以用来签署数据,通常也可以用来验证签名是否是相关数据的合法签名。 S i g n a t u r e对象属于模式( m o d a l )对象。也就是说 , S i g n a t u r e对象总是处于某个特定状态 ,对它只能 进行特定类型的操作。对象所处状态在它们各自的类中 (如S i g n a t u r e )以最终整型常量表示。通 常一个签名对象有三种状态 : (1) UNINITIALIZED(未初始化)。 (2) SIGN(签名)。 (3) VERIFY(验证)。 为了签名和验证签名,首先创建 S i g n a t u r e实例。正如所有服务类一样 ,通过调用S i g n a t u r e 类中的getInstance 静态方法可以获得具有特定签名算法的 S i g n a t u r e对象。 publ ic stat ic Signature getInstance(Str ing algor ithm) publ ic stat ic S ignature get Instance(Str ing algor i thm,Str ing provider) S i g n a t u r e对象在创建时处于U N I N I T I A L I Z E D状态,所以在使用前,必须先对其进行初始 化。S i g n a t u r e类定义了两种初始化方法 i n i t S i g n和i n i t Ve r i f y,它们可以分别将S i g n a t u r e对象的 状态转换成S I G N和V E R I F Y状态。到底采用哪一种方法 ,主要取决于是想对S i g n a t u r e对象进行 签名操作还是验证操作。如要进行签名操作,需用产生签名的实体的私钥初始化对象,这可 通过调用 i n i t S i g n方法实现: publ ic f inal void initSign(Pr ivateKey pr ivateKey) 调用这种方法使S i g n a t u r e对象处于S I G N状态。 如要进行验证操作 ,需用产生签名的实体的公钥初始化对象,这可通过调用 i n i t Ve r i f y方法 实现: publ ic f inal void in itVer i fy(Publ icKey publ icKey) 调用这种方法使S i g n a t u r e对象处于V E R I F Y状态。 如果S i g n a t u r e对象已经进行了签名初始化 (已经处于S I G N状态),就可以将待签署的数据 传递给对象,这可通过调用一次或多次 u p d a t e方法之一来实现: publ ic f inal void update(byte b) publ ic f inal void update(byte[] data) p u b l i c f inal void update(byte[] data ,int of f , int len) 对u p d a t e方法的调用一直持续到所有待签署的数据全部传递给了 S i g n a t u r e对象。 为了产生签名,只需简单地调用 s i g n方法: publ ic f inal byte[] s ign() publ ic f inal int s ign(byte[] outbuf , int of fset , int len) 第一种方法以 b y t e数组形式返回签名。第二种方法返回的签名结果存储在设定的缓冲区 o u t b u f中,o ff s e t表示缓冲区的初值, l e n表示o u t b u f的长度,这种方法返回的是实际存储的字 节数。签名可被带有两个整型参数 r、s的标准A S N . 1序列编码。 调用s i g n方法可以重置S i g n a t u r e对象状态,使它返回到调用 i n i t S i g n方法前的状态。也就 是说S i g n a t u r e对象被重置,并且可以通过重新调用 u p d a t a和s i g n,用同一个私钥产生另一个不 同的签名。相对地,可以重新调用 i n i t S i g n指定不同私钥,或者重新调用 i n i t Ve r i f y初始化 S i g n a t u r e对象验证签名。 如果S i g n a t u r e对象已经进行了验证初始化 (已经处于V E R I F Y状态),则可以通过向对象提 供验证数据(这个过程与签名过程相反 )来验证签名是否是相关数据的合法签名。这可以通过一 次或多次调用u p d a t e方法之一来实现: publ ic f inal void update(byte b) publ ic f inal void update(byte[] data) publ ic f inal void update(byte[] data ,int of f , int len) 对u p d a t e方法的调用一直持续到向S i g n a t u r e对象提供了所有的验证数据为止。 可以通过调用v e r i f y方法来验证签名: publ ic f inal boolean ver i fy(byte[] encodedSignature) 参数必须是包含签名的b y t e数组,该签名可被带有两个整型参数r、s的标准A S N . 1序列编码。 这是一种常用的标准编码。这与 S i g n方法产生的结果相同。v e r i f y方法返回一个b o o l e a n,以指 示编码的签名是否是u p d a t e方法所提供数据的合法签名。 调用v e r i f y方法可以重置S i g n a t u r e对象状态,使它返回到调用 i n i t Ve r i f y方法前的状态。也 就是说签名对象被重置,并且可以验证身份的另一个签名,该身份的公钥在调用 i n i t Ve r i f y时 指定。相对地,重新调用 i n i t Ve r i f y以不同公钥初始化 S i g n a t u r e对象来验证不同实体的签名, 或者重新调用 i n i t S i g n初始化S i g n a t u r e对象来产生签名。 7.3.5 算法参数 J C A可用来处理密码算法。不同的算法有很大的差异。每一种算法都有自己的参数 (密钥 大小和被定义常数 )。为了组织这些参数 ,每种算法都有一种算法参数规格说明 ,这些说明被分 成一些小的类集。 算法参数规格说明是算法所用参数集的清晰 ( t r a n s p a r e n t )表示。这意味着可以独立访问每 一个参数,虽然相应的规格说明类中定义了 g e t方法(如, D S A P a r a m e t e r S p e c定义了g e t p、g e t Q、 g e t G方法 ,它们可以分别访问 p、q、g参数 )。相反的,在模糊 ( o p a q u e )表示中 ,正如 A l g o r i t h m P a r a m e t e r s类所提供的 ,不能直接访问参数域。不过可以得到与参数集有关的算法名 124使Java 2平台安全技术—结构、API设计和实现 下载 (调用g e t A l g o r i t h m )和参数集的编码方法 (调用g e t E n c o d e d )。可以调用g e t P a r a m e t e r S p e c方法,把 A l g o r i t h m P a r a m e t e r s对象转换成清晰说明。 算法参数规格说明界面和类 下面讨论 j a v a . s e c u r i t y和j a v a . s c u r i t y. s p e c包中的算法参数规格说明界口和类: • AlgorithmParameterSpec • DSAParameterSpec • AlgorithmParameters • AlgorithmParameterGenerator 1. AlgorithmParameterSpec 对于密码参数的清晰说明 , AlgorithmParameterSpec是一种基本界面 ,它不含方法或常数。 它的唯一目的是对所有参数说明分组。所有参数说明必须实现这个界面。 2. DSAParameterSpec 这个类指定了D S A算法所用的参数集,用以实现 A l g o r i t h m P a r a m e t e r界面。它有三种方法 : publ ic BigInteger getP() public BigInteger getQ() public BigInteger getG() 这三种方法分别返回D S A算法参数:主要参数p、次要参数q、基数g。 3. AlgorithmParameters 这种服务类提供密码参数的模糊表示。像所有服务类一样,通过调用 g e t I n s t a n c e静态方法 可以获得特定算法类的对象,并且可以有选择地指定提供器名,以确保算法参数实现来自命 名的提供器。 publ ic stat ic Algor i thmParameters get Instance(Str ing algor i thm) publ ic stat ic Algor i thmParameters get Instance(Str ing algor i thm, String provider) 一旦AlgorithmParameters 对象实例化后,必须使用合适的参数说明及编码调用 i n i t进行初 始化。 publ ic void in i t (Algor i thmParameterSpec paramSpec) publ ic void in it(byte[] params) publ ic void in i t (byte[] params,Str ing format) 其中,p a r a m s是含有编码参数的数组, f o r m a t是解码格式名。在含有p a r a m s参数,而没有f o r m a t 参数的 i n i t方法中,使用基本解码格式。如果 A S N . 1参数说明存在,则基本的解码格式是 A S N . 1。注意: A l g o r i t h m P a r a m e t e r对象只能进行一次初始化 ,即不能重用。 在A l g o r i t h m P a r a m e t e r s对象中,通过调用g e t E n c o d e d方法可获得字节型参数编码: publ ic byte[] getEncoded() 其返回值是基本编码格式的参数。 为了获得指定编码格式参数 ,可以调用带有f o r m a t参数的g e t E n c o d e d方法: publ ic byte[] getEncoded(Str ing format) 如果f o r m a t参数为空,正如其他g e t E n c o d e d方法一样,使用基本编码格式。 第7章 编程密码学使用125 下载 由S U N提供器提供的A l g o r i t h m P a r a m e t e r s缺省实现中,格式参数通常被忽略。 算法参数的清晰说明可以通过调用 A l g o r i t h m P a r a m e t e r s对象的g e t P a r a m e t e S p e c方法获得: publ ic Algor i thmParameterSpec getParameterSpec(Class paramSpec) p a r a m S p e c指定将返回的参数的说明类。例如, D S A P a r a m e t e r S p e c . c l a s s ,将指明 D S A P a r a m e t e r S p e c的实例返回的参数。 4. AlgorithmParametersGenerator 这种服务类在创建AlgorithmParameter Generator实例后 ,可以产生指定算法的参数集。为 了获得特定算法的A l g o r i t h m P a r a m e t e r G e n e r a t o r对象,可以调用A l g o r i t h m P a r a m e t e r G e n e r a t o r类 中的getInstance 静态方法: publ ic stat ic Algor i thmParameterGenerator get Instance(Str ing algor i thm) publ ic stat ic Algor i thmParameterGenerator get Instance(Str ing algor i thm, Str ing provider) AlgorithmParamerGenerator 对象可用下列两种方式之一进行初始化: • 算法无关方式。 • 特定算法方式。 算法无关方式基于所有参数产生器共享随机数源和大小这一事实。虽然所有算法参数都 用到大小这一概念 ,但是不同算法的大小含义不同 ,例如,D S A算法中 ,大小以位的形式表示基 本模数。使用这种方法后 , 特定算法方式参数产生值缺省为一些标准值。 i n i t方法使用这两个广泛应用的参数类型。另一种 i n i t方法则只使用s i z e参数,其 r a n d o m是 系统缺省值。 publ ic void in i t ( int s ize,SecureRandom random); publ ic void init( int s ize) 在特定算法方式中,参数产生器对象必须采用特定算法语句进行初始化,该语句可由 AlgorithmParameterSpec 对象中特定算法参数产生值表示。 publ ic void in i t (Algor i thmParameterSpec genParamSpec,SecureRandom random) publ ic void in it(Algor ithmParameterSpec genParamSpec) 在系统参数产生过程中,如 D i ff i e - H e l l m a n中,参数产生值通常包含基本模数的大小 和随机指数的大小,两者均以位的形式表示。 D i ff i e - H e l l m a n的算法是 J C E 1 . 2的一部分 ,不在 J D K范围之内。 一旦创建并初始化了A l g o r i t h m P a r a m e t e r G e n e r a t o r对象,则可以调用g e n e r a t e P a r a m e t e r s方 法产生算法参数: publ ic Algor ithmParameters generateParameters() 7.3.6 java.security.Key和java.security.spec.KeySpec 本节讨论下面的界面和子界面: • Key • PublicKey • PrivateKey • KeySpec 1. Key K e y是所有模糊密钥中最高层的界面,它定义了所有模糊密钥对象的共享功能。模糊密钥 126使Java 2平台安全技术—结构、API设计和实现 下载 第7章 编程密码学使用127 下载 具有以下三个特性 : • 算法—密钥算法。 • 编码形式。 • 格式。 密钥算法指的是像D S A或R S A等与密钥有关的算法 ,它们结合RSA MD5和RSA SHA1等算 法一起工作。密钥算法名称可通过调用 g e t方法获得: publ ic Str ing getAlgor ithm() 编码形式是密钥的外部编码形式 ,当J V M外部(如发送密钥到第三方时 )需要密钥的标准表 示时,要用到编码形式。密钥按照标准格式 (如X . 5 0 9或P K C S # 8 )编码,可通过调用 g e t方法得 到编码形式: publ ic byte[] getEncoded() 格式是经过编码后的密钥格式,可以通过调用 g e t方法获得: publ ic Str ing getFormat() 密钥可以通过密钥产生器、证书、密钥说明 (使用K e y F a c t o r y )或K e y S t o r e实现等访问管理 密钥的密钥库来获得。利用 K e y F a c t o r y,可以用特定算法方式分析已编码密钥。同样,也可 以用C e r t i f i c a t e F a c t o r y分析证书。 2. PublicKey和P r i v a t e K e y P u b l i c K e y和P r i v a t e K e y界面均是对K e y界面的扩展。它们不提供方法,只为了实现类型安 全和类型辨识。 密钥说明是密钥材料的清晰表示。如果密钥存储在硬件设备中,它的说明可能包含辨识 密钥的信息。密钥的清晰意味着通过调用说明类中的 g e t方法可以分别访问每一个密钥材料值。 例如:D S A P r i v a t e K e y S p e c中的g e t X、g e t P、g e t Q、g e t G方法可以访问私钥 x和用于计算密钥 的D S A算法参数:主要参数p、次要参数q和基数g。 密钥可以用指定算法方式或算法无关方式编码格式 (如A S N . 1 )规定。如:D S A私钥可由参 数x、p、q规定,也可以用D E R编码规定。 3. KeySpec K e y S p e c界面不提供方法和常量。它唯一的目的是为所有密钥说明提供类型安全。所有密 钥说明必须实现这个界面。 • D S A P r i v a t e K e y S p e c。此类实现K e y S p e c界面并借助相关参数规定了 D S A私钥。它提供 下列方法返回私钥x,使用如下D S A算法参数:主要参数p、次要参数q和基数g。 publ ic BigInteger getX() publ ic BigInteger getP() publ ic BigInteger getQ() public BigInteger getG() • D S A P u b l i c K e y S p e c。此类实现K e y S p e c界面并借助相关参数规定了 D S A公钥。它提供下 列方法返回公钥y,使用如下D S A算法参数:主要参数p、次要参数q和基数g。 publ ic BigInteger getY() public BigInteger getP() public BigInteger getQ() publ ic BigInteger getG() • R S A P r i v a t e K e y S p e c。此类实现K e y S p e c界面并借助相关参数规定了 R S A私钥。它提供 下列方法返回组成R S A私钥的模数n和私有指数d。 publ ic BigInteger getMdulus() publ ic BigInteger getPr ivateExponent() • R S A P r i v a t e C r t K e y S p e c。此类是R S A P r i v a t e K e y S p e c类的一种扩展,它以 C RT信息值规 定一个R S A私钥(如P K C S # 1标准中所定义的 )。除了从其子类R S A P r i v a t e K e y S p e c中继承 的方法外,还提供下列方法: publ ic BigInteger getPubl icExponent() publ ic BigInteger getPr imeP() publ ic BigInteger getPr imeQ() publ ic BigInteger getPr imeExponentP() publ ic BigInteger getPr imeExponentQ() publ ic BigInteger getCrtCoeff ic ient() 这些方法分别返回公共指数 e和C RT信息整数:模数 n的主要因子p、n的主要因子q,指数d模 ( p - 1 )指数d模( q - 1 )和C RT系数模p。在逻辑上,R S A私钥只包含模数和私有指数,为了实现高 效性,才引入C RT值。 • R S A P u b l i c K e y S p e。此类实现K e y S p e c界面并规定R S A公钥。它提供下列方法,其返回 值为组成R S A公钥的模数n和公有指数e。 publ ic BigInteger getModulus() publ ic BigInteger getPubl icExponent() • E n c o d e d K e y S p e c。此类实现 K e y S p e c界面并以编码格式规定公钥或私钥。 E n c o d e d K e y S p e c类中的g e t E n c o d e d、g e t F o r m a t方法分别返回编码密钥和编码格式名。 publ ic abstract byte[] getEncoded() ; publ ic abstract Str ing getFormat() ; • P K C S 8 E n c o d e d K e y S p e c。此类是E n c o d e d K e y S p e c类的子类,表示符合P K C S # 8标准规定 格式的私钥的 D E R编码。g e t E n c o d e d方法返回符合 P K C S # 8标准经过编码的密钥字节, g e t F o r m a t方法返回字符串P K C S # 8。X 5 0 9 E n c o d e d K e y S p e c类是E n c o d e d K e y S p e c类的子 类,表示符合X . 5 0 9标准规定格式的私钥或公钥的 D E R编码。g e t E n c o d e d返回符合X . 5 0 9 标准经过编码的密钥字节,g e t F o r m a t方法返回字符串X . 5 0 9。 7.3.7 java.security.KeyFactory和java.security.cert.CertificateFactory 本节回顾生成密钥和证书的工厂类。 1. KeyFactory K e y F a c t o r y类是一种 (基本密钥材料的清晰表示 )模糊密钥 ( K e y类型)和密钥说明转换的服 务类。密钥工厂是双向的,也就是说,可以从给定的密钥材料建立模糊 K e y对象,也可以从 K e y对象获知密钥材料。 对同一个密钥可能有多个兼容的密钥说明。例如, D S A公钥可由y、p、q和g说明,也可 根据X . 5 0 9标准由D E R编码说明。密钥工厂可实现兼容的密钥说明间的相互转换,即密钥分析。 例如,将X 5 0 9 E n c o d e d K e y S p e c转换为D S A P u b l i c K e y S p e c,表示将已编码密钥分析为部件。 通过调用 K e y F a c t o r y类中的 g e t I n s t a n c e静态工厂方法可以获得特定类型密钥算法的 K e y F a c r o r y对象。 publ ic stat ic KeyFactory get Instance(Str ing algor i thm) publ ic stat ic KeyFactory get Instance(Str ing algor i thm,Str ing provider) 128使Java 2平台安全技术—结构、API设计和实现 下载 调用者通过指定提供器的名称,可保证密钥工厂的实现来自 K e y F a c t o r y的命名提供器。 在给定私钥或公钥的密钥说明中,调用 g e n e r a t e P u b l i c或g e n e r a t e P r i v a t e方法,可以分别获 得模糊P u b l i c K e y或P r i v a t e K e y对象。 publ ic Publ icKey generatePubl ic(KeySpec Keyspec) publ ic Pr ivateKey generatePrivate(KeySpec Keyspec) 相反地,对于给定K e y对象,调用g e t K e y S p e c方法可以获得相应的K e y S p e c对象。 publ ic KeySpec getKeySpec(Key key, Class KeySpec) K e y S p e c确定返回的密钥材料的说明类。例如,如果 K e y S p e c是D S A P u b l i c K e y S p e c . c l a s s , 就说明密钥材料将以D S A P u b l i c K e y S p e c类的实例形式返回。 2. CertificateFactory C e r t i f i c a t e F a c t o r y类是一个定义证书工厂功能的服务类。它可以用来从编码中产生证书和 C R L对象。X . 5 0 9证书的证书工厂的返回值是证书或 C R L对象,它们分别是 j a v a . s e c u r i t y. c e r t . X 5 0 9 C e r t i f i c a t e和j a v a . s e c u r i t y. c e r t . X 5
/
本文档为【java编程密码学】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。 本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。 网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。

历史搜索

    清空历史搜索