《Java加密体系结构精品资料.docx》由会员分享,可在线阅读,更多相关《Java加密体系结构精品资料.docx(50页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、JavaTM 加密体系结构API 规范和参考2011 年 01 月 30 日简介 设计原理 体系结构 概念 核心类和接口 Provider 类 如何请求和提供提供者的实现 安装提供者 Sercuity 类 MessageDigest 类 Signature 类 算法参数类 算法参数规范接口和类 【AlgorithmParameterSpec 接口】 【DSAParameterSpec 类 】 AlgorithmParameters 类 AlgorithmParameterGenerator 类 密钥接口 密钥规范接口和类 KeySpec 接口 DSAPrivateKeySpec 类 DSAPu
2、blicKeySpec 类 RSAPrivateKeySpec 类 RSAPrivateCrtKeySpec 类 RSAPublicKeySpec 类 EncodedKeySpec 类 PKCS8EncodedKeySpec 类 X509EncodedKeySpec 类 KeyFactory 类CertificateFactory 类KeyPair 类 KeyPairGenerator 类 密钥管理 Keystore 位置 Keystore 实现 KeyStore 类 SecureRandom 类代码示例 计算 MessageDigest 对象 生成密钥对 用生成的密钥来生成和校验签名 用密钥
3、规范和 KeyFactory 来生成和校验签名 读取用 Base64 编码的证书 解析证书答复 附录 A:标准名称 附录 B:算法 -简介JDK 安全 API 是 Java 编程语言的核心 API,位于 java.security 包(及其子包)中。该 API 设计用于帮助开发人员在程序中同时使用低级和高级安全功能。JDK 1.1 中第一次发布的 JDK 安全中引入了“Java 加密体系结构”(JCA),指的是用于访问和开发 Java 平台密码功能的构架。在 JDK 1.1 中,JCA 包括用于数字签名和报文摘要的 API。 正如本文档所述,JDK 1.2 大大扩展了 Java 加密体系结构。
4、它还对证书管理基础结构进行了升级以支持 X.509 v3 证书,并为划分细致、可配置性强、功能灵活、可扩展的访问控制引入了新的 Java 安全体系结构。 Java 加密体系结构包含 JDK 1.2 安全 API 中与密码有关的部分,以及本文档中提供的一组约定和规范。为实现多重、可互操作的密码,它还提供了“提供者”体系结构。 Java 密码扩展 (JCE) 扩展了 JCA API,包括用于加密、密钥交换和信息认证码(MAC)的 API。JCE 和 JDK 密码共同提供了一个与平台无关的完整密码 API。JCE 作为 JDK 的扩展将独立发布,以符合美国的出口控制约束。 本文档是对 Java 开发
5、工具包 (JDK) 1.2 版中发布的 Java 加密体系结构 API 及其缺省提供者的描述和说明。描述 JCE API 的文档将在 JCE 版本中提供。有关 JDK 安全 API 中 Java 安全体系结构方面的信息,参见“Java 安全体系结构规范”。 注:该 JCA 规范的最新版本可在公共网站 上找到。设计原理Java 加密体系结构 (JCA) 是根据以下原理设计的: 实现的独立性和互操作性 算法的独立性和可扩展性 实现的独立性和算法独立性是互补的:其目的是让 API 用户能用密码学的概念(如数字签名和报文摘要),但又不必关心这些概念的实现甚至实现这些概念所用算法的实现。当不可能完全实现
6、算法独立性时,JCA 将为开发人员提供标准的特定算法 API。当实现方法的独立性不可能实现时,JCA 将让开发人员指明所要求的特定实现方法。 算法独立性是通过定义密码“引擎”(服务)的类型以及定义提供这些密码引擎功能的类来实现的。这些类称为 engine(引擎)类,例如 MessageDigest 类、 Signature 类和 KeyFactory 类。 实现的独立性是通过使用基于“提供者”的体系结构而实现的。密码服务提供者(简称“提供者”)指的是用于实现一种或多种密码服务的一个包或一组包,如数字签名算法、报文摘要算法及密钥交换服务。程序可以只是简单地请求某类对象(如签名对象)实现某种服务(
7、如 DSA 数字签名算法),并从任一安装好的提供者上获取实现方法。反之,必要时程序可从某个特定的提供者那请求实现方法。当有更快或更安全的版本可用时,提供者的升级对应用程序来说是透明的。 实现的互操作性指的是各种实现方法可在一起工作,使用彼此的密钥或校验彼此的签名。这意味着对于相同的算法,由一个提供者生成的密钥可被另一个提供者使用,而一个提供者生成的签名也可由另一个提供者来校验。 算法的可扩展性指的是可以很容易地添加那些能适应所支持的 engine 类的新算法。体系结构密码服务提供者Java 加密体系结构引入了密码服务提供者 (简称为“提供者”)的概念。它是指一个(或一组)包,用于提供 JDK
8、安全 API 的密码子集的具体实现。 例如,在 JDK 1.1 中,提供者可包含一个或多个数字签名算法、报文摘要算法及密钥生成算法的实现。JDK 1.2 增加了五类附加服务:密钥工厂、密钥仓库的创建与管理;算法参数管理;算法参数的生成和证书工厂。它还允许提供者提供随机数生成 (RNG) 算法。在以前的版本中,RNG 不是由提供者提供的,而是某一特定的算法嵌入在 JDK 中的。 如前所述,程序可以只是简单地请求某类对象(如 Signature 对象)提供某种服务(如 DSA 签名算法),并从某一安装好的提供者上获取该对象的实现方法。程序也可请求某一特定的提供者(每个提供者都有自己的名称,供引用时
9、使用)。 Sun 版本的 Java 运行时环境都带有一个名为“SUN”的缺省标准提供者。其它的 Java 运行时环境可能不一定提供“SUN”提供者。“SUN”提供者包包括: 一个数字签名算法 (DSA) 的实现,在 NIST FIPS 186 中描述。 一个 MD5 (RFC 1321) 和 SHA-1 (NIST FIPS 180-1) 报文摘要算法的实现。 一个 DSA 密钥对的生成器,用于生成与该 DSA 算法相匹配的公钥和私钥对。 一个 DSA 算法参数生成器。 一个 DSA 算法参数管理器。 一个 DSA “密钥工厂”,用于提供(不透明)的 DSA 私钥对象和公钥对象及其所含的密钥信
10、息之间 的双向转换。 一个符合 IEEE P1363 标准(见附录 G.7)的专用“SHA1PRNG”伪随机数生成算法的实现。 一个为 X.509 证书和证书撤消清单 (CRL) 服务的“证书工厂”。 一个用于名为“JKS”的专用密钥仓库类型的密钥仓库实现。 每个 JDK 安装都将安装一个或多个提供者包。新的提供者可以以动态或静态方式添加进来(参见 Provider 和 Security 类)。Java 加密体系结构提供了一组可供用户查询安装有哪些提供者及这些提供者支持哪些服务的 API。 客户可用不同的提供者配置他们的运行环境,并为每个提供者指定一个优先顺序。优先顺序是在未请求某一指定提供者
11、时根据所请求的服务对提供者进行搜索的顺序。 密钥管理可使用一个叫做“密钥仓库”的数据库来管理密钥和证书。 应用程序可使用密钥仓库来完成认证或签名。 应用程序可通过实现 java.security 包中的 KeyStore 类来访问密钥仓库。Sun Microsystems 提供了一个缺省 KeyStore 实现方法。它利用一个名为“JKS”的专用密钥仓库类型(格式),将密钥仓库实现为一个文件。 通过使用 KeyStore 类中提供的“getInstance”方法,应用程序可从不同的提供者中选择不同类型的密钥仓库实现方法。 有关详细信息,参见密钥管理一节。概念本节介绍 API 中引入的一些主要概
12、念。 引擎类和算法一个“引擎类”以一种抽象方式(无具体的实现方法)定义一种密码服务。 密码服务总是与某个特定的算法或类型相关联,它或者提供密码运算(如数字签名或报文摘要中的运算),生成或提供密码运算所需要的密码信息(密钥或参数),或者生成安全封装的密钥(这些密钥可用于密码运算中)的数据对象。例如,Signature 和 KeyFactory 类就是两个引擎类。Signature 类提供对数字签名算法功能的访问。DSA KeyFactory 以一种可供 DSA Signature 对象的 initSign 或 initVerify 方法使用的格式提供 DSA 私钥或公钥(从其编码或透明规范中)。
13、 Java 加密体系结构包含了 JDK 1.2 安全包中与密码有关的类,包括引擎类。API 用户可通过请求和利用引擎类的实例来执行相应的运算。JDK 1.2 中定义了以下引擎类: MessageDigest 用于计算数据的报文摘要(散列)。 Signature 用于对数据进行签名和校验数字签名。 KeyPairGenerator 用于生成与指定算法相匹配的公钥和私钥对。 KeyFactory 用于将类型为 Key(密钥)的不透明密钥转换为密钥规范(密钥信息的透明表示),反 之亦然。 CertificateFactory 用于创建公钥证书和证书撤消清单(CRL)。 KeyStore 用于创建和管
14、理密钥仓库。密钥仓库是密钥的数据库。密钥仓库中的私钥有一个与之关 联的证书链,用于认证对应的公钥。密钥仓库还含有来自可信实体的证书。 AlgorithmParameters 用于管理某一特定算法的参数,包括编码和解码参数。 AlgorithmParameterGenerator 用于生成一组与指定算法相匹配的参数。 SecureRandom 用于生成随机数或伪随机数。 注意:“生成器”将创建新对象,而“工厂”将从现有信息(如某个编码方法)中创建对象。一个引擎类提供某类密码服务功能的接口(与特定的密码算法无关)。它定义“应用程序接口” (API) 方法,以使应用程序能够访问所提供的某类密码服务。
15、实际的实现方法(由一个或多个提供者提供)即是那些指定算法的实现。例如,Signature 引擎类将提供对数字签名算法功能的访问。SignatureSpi 子类中(参见下一段落)所提供的实际实现方法将是某个指定签名算法(如带有 DSA 的 SHA1、 带有 RSA 的 SHA1 或带有 RSA 的 MD5)的实现。 引擎类所提供的 API 是用“服务提供者接口” (SPI) 来实现的。也就是说,对每一个引擎类,都有一个对应的抽象 SPI 类,它定义了密码服务提供者必须实现的服务提供者接口方法。 作为引擎类的实例,“API 对象”封装(作为 private 域)了对应的 SPI 类的实例,即“SP
16、I 对象”。API 对象的所有 API 方法都被声明为“final”,且其实现方法调用了所封装的 SPI 对象的相应 SPI 方法。调用某个引擎类的 getInstance factory 方法将创建该引擎类(及其对应的 SPI 类)的实例。 SPI 类的名称与对应的引擎类名称相同,后跟“Spi”。例如,与 Signature 引擎类相对应的 SPI 类是 SignatureSpi 类。 每个 SPI 类都是抽象的。要实现某一指定算法的某一特定类型的服务,提供者必须对相应的 SPI 类进行子类化并提供所有抽象方法的实现。 另一个引擎类的例子是 MessageDigest 类,它提供对报文摘要算
17、法的访问。它在 MessageDigestSpi 子类中的实现可以是诸如 SHA-1、MD5 或 MD2 各种报文摘要算法的实现。 最后一个例子:KeyFactory 引擎类支持将不透明密钥转换为透明密钥的规范,反之亦然(参见密钥规范接口和类一节)。KeyFactorySpi 子类中提供的实际实现将是指定类型的密钥(如 DSA 公钥和私钥)的实现。 实现和提供者各种密码服务的实现由 JCA 密码服务提供者提供。提供者实际上是那些可提供一个或多个密码服务实现的包。例如,Java 开发工具包 (JDK) 的缺省提供者名为“SUN”,它可提供下述算法的实现:DSA 签名算法、MD5 和 SHA-1
18、报文摘要算法、DSA 密钥对生成算法和 SHA1PRNG 伪随机数生成算法。它还为 DSA 私钥和公钥提供密钥工厂,为 X.509 证书和 CRL 提供证书工厂,并提供 DSA 参数(包括其生成)的实现,同时也可为名为“JKS”的专用密钥仓库类型提供密钥仓库的实现。 其它提供者也可能已为这些服务或其它服务(如某个基于 RSA 的签名算法或 MD2 报文摘要算法)定义了自己的实现。 获得实现实例的 factory(工厂)方法对于 API 中的每个引擎类,调用该引擎类中的 factory 方法就对某个特定的实现方法提出了请求并将之实例化。factory 方法是一种静态方法,它返回类的实例。 获取正
19、确 Signature(签名)对象的基本机制如下所示:用户通过指定签名算法名(如“带 DSA 的 SHA1”),或再加上提供所需实现的提供者名称,然后调用 Signature 类中的 getInstance 方法,即可请求获得该对象。getInstance 方法将找到一种满足给定算法和提供者参数的实现方法。如果不指定提供者,getInstance 将按优先顺序搜索已注册的提供者,最后确定带指定算法的实现的提供者。有关注册提供者的详细信息,参见 Provider 类 。核心类和接口本节将讨论 Java 加密体系结构中提供的核心类和接口: Provider 和 Security 类 Message
20、Digest、Signature、KeyPairGenerator、 KeyFactory、AlgorithmParameters、 AlgorithmParameterGenerator、CertificateFactory、 KeyStore 和 SecureRandom 引擎类 密钥接口和类 算法参数规范接口和类及密钥规范接口和类 本节将演示每个类和接口中 main 方法的功能。相应的示例部分给出了这些类(MessageDigest、Signature、KeyPairGenerator、SecureRandom、KeyFactory 以及密钥规范类)的用法示例。有关 Security A
21、PI 包的完整参考文档,可在以下网址中找到: java.security 包概览 java.security.spec 包概览 java.security.interfaces 包概览 Provider 类“密码服务提供者”(简称“提供者”)是指一个或一组包,该包可提供 JDK 安全 API 密码功能子集的具体实现。Provider 类是这个(或这组)包的接口。它含有访问提供者名称、版本号和其它信息的方法。 要实际提供密码服务的实现,某一实体(如某个开发小组)就必须编写实现代码和创建 Provider 类的子类。该子类的构造函数将对 JDK 安全 API 查询由提供者所实现的服务所需各种属性的
22、值进行设置。也就是说,它指定了实现各种服务的类的名称。 提供者包可实现多种类型的服务 参见引擎类和算法。 不同的实现可能有不同的功能。有些可能是基于软件的,而另一些可能是基于硬件的。有些可能与平台无关,而另一些可能是针对指定平台的。有些提供者提供源代码以供复查和评估用,而另一些却不提供。 Java 加密体系结构 (JCA) 可让最终用户和开发人员都能决定各自所需。本节中,我们将说明最终用户如何安装满足自身需求的密码实现,同时也介绍开发人员如何请求满足自身需求的实现。 (注意: 有关实现Provider的信息,参见如何为 Java 加密体系结构实现Provider。) 如何请求和提供Provid
23、er的实现对 API 中的每个引擎类,任一特定的实现都是通过下列方法来进行请求和实例化的:首先指定所要的算法名称,有时再加上指定所需实现所属的提供者名称,然后调用该引擎类中的 getInstance 方法。 如果不指定提供者,getInstance 将搜索已注册的提供者,确定与指定算法相关联的所需密码服务的实现。在每个给定的 Java 虚拟机 (JVM) 中,将按某一给定的优先顺序来安装提供者。该顺序是在请求中未指定提供者时搜索提供者所用的顺序。例如,假设 JVM 中安装有两个提供者,一个名为“PROVIDER_1”,另一个名为“PROVIDER_2”。 进一步假设: PROVIDER_1 实
24、现 SHA1withDSA、SHA、MD5、DES 和 DES3 PROVIDER_2 实现 SHA1withDSA、MD5withRSA、MD2withRSA、MD2、MD5、RC4、RC5、DES 和 RSA 如果 PROVIDER_1 的优先顺序是 1 (最高优先顺序),而 PROVIDER_2 的优先顺序是 2,则将导致以下行为: 假设正在查询 MD5 的实现。尽管这两个提供者都提供上述实现,但返回的是 PROVIDER_1 上的实现, 这是因为 PROVIDER_1 具有最高优先权,因而将最先被搜索到。 如果是在查询 MD5withRSA 签名算法,就会首先搜索 PROVIDER_1
25、 以查询该方法。由于在 PROVIDER_1 上找不到该实现,因此接着对 PROVIDER_2 进行搜索。找到该实现后即将将其返回。 假设是在查询 SHA1withRSA 签名算法。由于所安装的提供者都不提供该实现,因此抛出 NoSuchAlgorithmException 。 带提供者变量的 getInstance 方法是为那些需要指定一个算法应由哪个提供者来提供的开发人员而准备的。例如,联邦代理机构要用已被联邦认证的提供者的实现。不妨假设由 PROVIDER_1 提供的的 SHA1withDSA 实现还没有接受这样的证书,而由 PROVIDER_2 提供的 DSA 实现已接受该证书。 于是
26、,Federal 程序将指定 PROVIDER_2 来进行下列调用,因为它含有已获证书的实现: Signature dsa = Signature.getInstance(SHA1withDSA, PROVIDER_2);这种情况下,如果没有安装“PROVIDER_2”,则将抛出 NoSuchProviderException,即使有另一个已安装了的提供者可实现所请求的算法。 程序也可选择获取一个包括所有安装了的提供者的清单(使用 Security 类中的getProviders 方法)并从该清单中选取某个提供者)。安装提供者安装提供者包括两部分:安装提供者包中的类及对提供者进行配置。安装 P
27、rovider 类有几个方法可用于安装 provider 类: 将包含这些类的 zip 或 JAR 文件放在 CLASSPATH 中的任何位置 将提供者的 JAR 文件作为“已安装”或 “已捆绑的”扩展来提供。有关如何部署某个扩展的详细信 息,参见如何发布扩展。 配置提供者下一步是将提供者添加到认可的提供者的清单中。这是通过编辑 JKD lib/security 目录中的 java.security 文件来静态完成的。因此,如果 JDK 安装在 jdk1.2 目录中,则该文件将是 jdk1.2/lib/security/java.security。可在java.security 中进行设置的一
28、类属性具有以下形式: security.provider。n=masterClassName该语句声明了一个提供者,并指定其优先顺序 n。优先顺序是在没有指定提供者时查询所请求的算法时搜索各提供者所用的顺序。顺序以 1 为基础,即 1 是最高的优先级,紧接着是 2 等等。 masterClassName 必须指定提供者的“main”类。提供者的文档将指定其主类。这个主类永远是 Provider 类的一个子类。子类的构造函数设置了 JDK 密码 API 查询提供者所实现的算法或其它功能所需的各种属性的值。 假设该主类是 COM.acme.provider.Acme,而且您想将 Acme 配置为具
29、有第三优先级的提供者。为此,请将下列行添加到 java.security 文件中: security.provider.3=COM.acme.provider.Acme用户也可动态地注册提供者。要动态地注册提供者,请调用 Security 类中的 addProvider 或 insertProviderAt 方法。这种类型的注册并不是持久的,且只能由“可信任”的程序来进行。参见安全。Provider 类的方法每个 Provider 类的实例都有一个名称(目前区分大小写)、版本号和该提供者及其服务的描述字符串。通过调用下述方法查询 Provider 实例,即可获得这些信息: public Str
30、ing getName() public double getVersion()public String getInfo()Security 类Security 类管理所安装的提供者和系统安全范围内的属性。它只含静态方法,并且无法实例化。 注意:用于添加或去除提供者及用于设置 Security 属性的方法只能由可信任的程序来执行。 目前,“可信任的程序”是指 没在安全管理器下运行的本地应用程序,或者 拥有执行指定方法权限的 applet 或应用程序(如下所示)。 为使代码可信任并可执行某项动作(如添加提供者),需要授予该 applet 对该特定动作的权限。 例如,在缺省 Policy(策略)
31、实现中,JDK 安装的策略配置文件指定了给定代码源中代码的权限(即可访问哪些类型的系统资源)。 (有关详细信息,参见后面的内容和 “缺省 Policy 实现和策略文件语法” 及 “Java 安全体系结构规范”文件)。 正在执行的代码总是来自某个特定的“代码源”。代码源不仅包括 applet 的源位置(URL),而且包括与签写代码的私钥相对应的公钥的引用。代码源中的公钥由用户密钥仓库中的(符号)别名引用。 在策略配置文件中,代码源可表示为两个组件: 一个是代码源 (URL),另一个是别名(前面由“signedBy”引导)。其中,别名用于标识含有校验代码签名所用公钥的 keystore 入口。 上
32、述文件中的每个“grant”语句将一组权限授予指定的代码源,指明哪些动作是允许使用的。 以下所示的是一个样本策略配置文件。 grant signedBy sysadmin, codeBase file:/home/sysadmin/ permission java.security.SecurityPermission Security.insertProvider.*; permission java.security.SecurityPermission Security.removeProvider.*; permission java.security.SecurityPermissi
33、on Security.setProperty.*; ;该样本文件指定:只有从本地文件系统上“/home/sysadmin/”目录(及其以下目录)下某个已签名 JAR 文件(其签名可用用户密钥仓库中的“sysadmin”别名所引用的公钥来校验)加载来的代码,才能调用 Security 类中的方法以添加或去除提供者或设置 Security 属性。 代码源的任一组件(或两个组件)都可以没有。下面就是一个没有 codeBase 组件的示例: grant signedBy sysadmin permission java.security.SecurityPermission Security.ins
34、ertProvider.*; permission java.security.SecurityPermission Security.removeProvider.*; ;如果上述策略生效,则来自“sysadmin”签名 JAR 文件中的代码就可以添加/删除提供者 不管这个 JAR 文件来源于何处。 以下是一个没有签名人的示例: grant codeBase file:/home/sysadmin/ permission java.security.SecurityPermission Security.insertProvider.*; permission java.security.S
35、ecurityPermission Security.removeProvider.*;该例中,本地文件系统上“/home/sysadmin/”目录(及其以下目录)下的代码都可以添加/删除提供者。代码无需签名。 以下是一个既无 codeBase 又无 signedBy 的示例: grant permission java.security.SecurityPermission Security.insertProvider.*; permission java.security.SecurityPermission Security.removeProvider.*; ;此处,由于代码源的两个
36、组件都没有,因此任何代码(无论它来自何处或是否已签名,也不管是谁签名)都可以添加/删除提供者。 管理 ProviderSecurity 类可用于查询所安装的提供者,也可用于运行时安装新提供者。 查询 Provider public Provider getProviders()该方法将返回一个数组,其中包含了所有已安装的提供者(从技术上来说,是每个包提供者的 Prodiver 子类)。数组中各 Provider 的顺序就是它们的优先顺序。 public Provider getProvider(String providerName)此方法将返回名为 providerName 的 Provid
37、er。 如果找不到该 Provider,它将返回 null。 添加 Providerpublic static int addProvider(Provider provider) 此方法将向已安装的提供者清单中添加提供者。它将返回该提供者所添加处的优先位置;如果由 于已安装该提供者的缘故而没有添加该提供者,则返回 -1。 public int insertProviderAt(Provider provider, int position) 此方法将在某个指定位置添加新提供者。该位置就是在未指定要用哪个提供者的情况下,查询所 请求的算法时搜索各提供者所用的优先顺序。位置以 1 为基础, 1
38、的优先级最高,接着是 2 等 等。如果已将给定的提供者安装在所要求的位置上,则原先位于该位置的提供者及所有位置大于 该位置的提供者都要上移一个位置(向已安装的提供者的清单末端方向移动)。 注意,我们不能担保一定能将该提供者添加到所要求的位置上。例如,有时添加提供者是合法的,但只能加到最后的位置。这种情况下 position(位置)参数将被忽略。同样,如果该提供者已被安装,也就无法再添加它了。 该方法将返回该提供者所添加处的实际优先位置;如果由于已安装该提供者的缘故而没有添加该提供者,则返回 -1。 注意:如果要改变某个提供者的优先级位置,必须先将它删除,然后再将它插入新的优先级位置。 删除提供
39、者 public void removeProvider(String name)此方法将删除指定名称的提供者。如果该提供者并未安装,它将无声返回。当指定的提供者被删除后,位置大于被删除的提供者所在位置的所有提供者都要下移一个位置(向已安装的提供者清单起始方向移动)。Security 属性Security 类含有一系列全系统安全属性。可信任的程序可通过以下方法来访问这些属性并可对其进行设置。 public static String getProperty(String key) public static void setProperty(String key, String datum)M
40、essageDigest 类MessageDigest 类是一个引擎类,它是为了提供诸如 SHA1 或 MD5 等密码上安全的报文摘要功能而设计的。密码上安全的报文摘要可接受任意大小的输入(一个字节数组),并产生固定大小的输出,该输出称为一个摘要或散列。摘要具有以下属性: 无法通过计算找到两个散列成相同值的报文。 摘要不反映任何与输入有关的内容。 使用报文摘要可以生成数据唯一且可靠的标识符。有时它们被称为数据的“数字指纹”。 创建 MessageDigest 对象计算摘要的第一步是创建报文摘要实例。象所有的引擎类一样,获取某类报文摘要算法的 MessageDigest 对象的途径是调用 Mes
41、sageDigest 类中的 getInstance 静态 factory 方法: public static MessageDigest getInstance(String algorithm)注意:算法名不区分大小写。例如,以下所有调用都是相等的: MessageDigest.getInstance(SHA) MessageDigest.getInstance(sha)MessageDigest.getInstance(sHa)调用程序可选择指定提供者名称,以保证所要求的算法是由已命名提供者实现的: public static MessageDigest getInstance(Stri
42、ng algorithm, String provider)调用 getInstance 将返回已初始化过的报文摘要对象。因此,它不需要进一步的初始化。更新报文摘要对象计算数据的摘要的第二步是向已初始化的报文摘要对象提供数据。这将通过一次或多次调用以下某个 update(更新)方法来完成: public void update(byte input) public void update(byte input)public void update(byte input, int offset, int len)计算摘要通过调用 update 方法提供数据后,程序就调用以下某个 digest(摘
43、要)方法来计算摘要: public byte digest() public byte digest(byte input) public int digest(byte buf, int offset, int len)前两个方法返回计算出的摘要。后一个方法把计算出的摘要储存在所提供的 buf 缓冲区中,起点是 offset。len 是 buf 中分配给该摘要的字节数。该方法返回实际存储在 buf 中的字节数。 对接受输入字节数组变量的 digest 方法的调用等价于用指定的输入调用: public void update(byte input),接着调用不带参数的 digest 方法。 有
44、关详细信息,参见示例部分。Signature 类Signature 类是个引擎类 ,它是为了提供诸如 DSA 或 RSA with MD5 这样的数字签名算法功能而设计的。密码学上安全的签名算法可接受任意大小的输入和一个私钥,并产生一个比较短(常常是固定大小的)的名为 signature 的字节串,它具有以下属性: 给定与签名的私钥相对应的公钥,就应能校验输入的真实性和完整性。 签名和公钥不反映有关私钥的任何内容。 Signature 对象可用于数据签名。它还可用于校验某个签名是否为与之关联的数据的真实签名。 有关对数据签名和校验的样例,参见示例部分。 Signature 对象状态Signature 对象是个模型对