SlideShare a Scribd company logo
1 of 18
1、概述
本技术书分别对 JCE 与 CAPICOM 各自的背景、体系和一些细节进行了介绍。同时介绍了
基于 JCE 和 CAPICOM 接口的安全基础应用(包括加解密和数字签名)实现互通的原理,
并提供了一套示例系统,详细说明了其设计思路、具体流程以及源代码,最后给出基于 JCE
和 CAPICOM 安全接口互通应用构建的参考模型。

本技术书通过对 JCE 和 CAPICOM 安全接口之间互通的介绍,从证书在各种应用环境下的
格式、包含的内容、应用进行了全面的分析。上海 CA 中心在系统的研发上精益求精,注重
安全性、功能性、易用性和实效性,保证了证书认证系统能够满足运营和操作的需求,保证
了其有效、可靠、安全。




2、证书格式介绍
X.509 目前有三个版本:V1、V2 和 V3。

X.509 V1 和 V2 证书所包含的主要内容如下:

   证书版本号(Version)
    版本号指明 X.509 证书的格式版本,现在的值可以为 0、1、2,也为将来的版本进行了预
    定义。
   证书序列号(SerialNumber)
    序列号指定由 CA 分配给证书的唯一的数字型标识符。当证书被取消时,实际上是将此证
    书的序列号放入由 CA 签发的 CRL 中,这也是序列号唯一的原因。
   签名算法标识符(Signature)
    签名算法标识用来指定由 CA 签发证书时所使用的签名算法。算法标识符用来指定 CA 签
    发证书时所使用的公开密钥算法和 hash 算法,须向国际知名标准组织(如 ISO)注册。
   签发机构名(Issuer)
    此域用来标识签发证书的 CA 的 X.500 DN 名字。包括国家、省市、地区、组织机构、单
    位部门和通用名。
   有效期(Validity)
    指定证书的有效期,包括证书开始生效的日期和时间以及失效的日期和时间。每次使用证
    书时,需要检查证书是否在有效期内。
   证书用户名(Subject)
    指定证书持有者的 X.500 唯一名字。包括国家、省市、地区、组织机构、单位部门和通用
    名,还可包含 email 地址等个人信息等。
   证书持有者公开密钥信息(subjectPublicKeyInfo)
    证书持有者公开密钥信息域包含两个重要信息:证书持有者的公开密钥的值;公开密钥使
    用的算法标识符。此标识符包含公开密钥算法和 hash 算法。
   签发者唯一标识符(Issuer Unique Identifier)
    签发者唯一标识符在第 2 版加入证书定义中。           此域用在当同一个 X.500 名字用于多个认证
机构时,用一比特字符串来唯一标识签发者的 X.500 名字。可选。
   证书持有者唯一标识符(Subject Unique Identifier)
    持有证书者唯一标识符在第 2 版的标准中加入 X.509 证书定义。此域用在当同一个 X.500
    名字用于多个证书持有者时, 用一比特字符串来唯一标识证书持有者的 X.500 名字。 可选。
   签名值(Issuer's Signature)
    证书签发机构对证书上述内容的签名值。

X.509 V3 证书是在 v2 的基础上一标准形式或普通形式增加了扩展项,以使证书能够附带额
外信息。标准扩展是指由 X.509 V3 版本定义的对 V2 版本增加的具有广泛应用前景的扩展
项,任何人都可以向一些权威机构,如 ISO,来注册一些其他扩展,如果这些扩展项应用广
泛,也许以后会成为标准扩展项。




3、JCE 概述

3.1 JAVA 安全体系

Java 体系结构对安全性的支持主要是通过 Java 语言本身安全性、虚拟机的类加载器和
安全管理器以及 Java 提供的安全 API 几个方面来实现:防止恶意程序的攻击,程序不能
破坏用户计算机环境;防止入侵,程序不能获取主机或所在内网的保密信息;鉴别,验
证程序提供者和使用者的身份;加密,对传输交换的数据进行加密,或者给持久化的数
据进行加密;验证,对操作设置规则并且进行验证。

JAVA 安全框架提供了三类主要的安全 API:

   Java 认证和授权服务 (Java Authentication and Authorization Service, JAAS)
    提供了一种灵活的、  说明性的机制,      用于对用户进行认证并验证他们访问安全资源的能力。
   Java 安全套接字扩展 (Java Secure Socket Extension, JSSE)
    定义了通过安全套接字层(SSL)进行安全 Web 通信的一种全 Java 的机制。
   Java 加密扩展 (Java Cryptography Extension, JCE)
    提供了加密、  密钥产生、    密钥协议、     验证算法的开发基础,        以及常用加密算法的实现方案。

目前 JAAS、JSSE 与 JCE 已经被集成到 1.4 以上版本的 Java 平台中。



3.2 JCE 简介

Java 平台为安全和加密服务提供了两组 API:JCA 和 JCE。

JCA (Java Cryptography Architecture)提供基本的加密框架,如证书、数字签名、消息摘要和
密钥对产生器。

JCE(Java Cryptography Extension) 在 JCA 的基础上作了扩展,包括加密算法、密钥交换、密
钥产生和消息鉴别服务等接口。JCE 支持多种类型的加密,包括对称的、非对称的、块和流
密码。

JCE 共有 3 个包、26 个类、4 个接口和 4 个异常。主要如下:

   密钥
    Key 接口(java.security.Key)实现了密钥概念的模型化。
    KeyPair 类(java.security.KeyPair)是对非对称密钥的扩展,是一个数据结构类。
    KeyPairGenerator 类(java.security.KeyPairGenerator)用于生成非对称密钥。
    KeyGenerator 类(java.crypto.KeyGenerator)用于生成秘密密钥。
    KeyFactory 类(java.security.KeyFactory)用于转换非对称密钥。
    SecretKeyFactory 类(javax.crypto.SecretKeyFactory)用于转换秘密密钥。
   证书
    Certificate 类(java.security.cert.Certificate)提供一种基础设施以支持对证书必要的操作。
    CertificateFactory 类(java.security.cert.CertificateFactory)用于导入指定类型的证书。
    X509 Certificate 类(java.security.cert.X509Certificate)支持 X509 3 格式的证书。
   密钥管理
    KeyStore 类(java.security.KeyStore)表示一组私钥、别名/实体及其对应的证书。
    KeyAgreement 类(javax.crypto.KeyAgreement)用于秘密密钥的分发。
   消息摘要
    MessageDigest 类(java.security.MessageDigest)实现创建和验证消息摘要的操作。
    Mac 类(javax.crypto.Mac)实现创建和验证安全消息摘要/消息鉴别码的操作。
    DigestOutputStream 类(java.security.DigestOutputStream)提供与信息摘要相关的输出流。
    DigestInputStream 类(java.security.DigestInputStream)提供与信息摘要相关的输入流。
   数字签名
    Signature 类(java.security.Signature)用于数字签名的创建与验证。
    SignedObject 类(java.security.SignedObject)用于可序列化对象与数字签名的封装。
   加密解密
    Cipher 类(javax.crypto.Cipher)用于加密/解密以及密钥封装。
    CipherOutputStream 类(javax.crypto.CipherOutputStream)用于将输出数据加密后放入流中。
    CipherInputStream 类(javax.crypto.CipherInputStream)用于从流中读取数据并解密。
    SealedObject 类(javax.crypto.SealedObject)用于可序列化队形加密封存。

Sun JCE 的详细信息请参阅 Java 官方网站



3.3 安全提供者

安全提供者是用来管理安全软件包中所用的各种引擎、与这些引擎相对应的合法算法、以及
任何 Java 虚拟机都可以得到的算法/引擎对的具体实现。

安全提供者体系结构:

   引擎类
    Java 虚拟机提供引擎类,它们是核心 API 的一部分。引擎是程序员所能执行的一个操作,
    它往往是抽象的,且与具体的算法实现无关。
   算法类
    基本上针对每一种引擎都有一组类实现相关的算法。Java 平台提供了一组默认的算法类,
其他第三方机构可提供另外的算法类。这些类可提供一个或多个算法以实现相应的引擎。
   提供者类
    开发商所提供的每组算法类是利用 Provider 类的一个实例进行管理的。提供者知道如何将
    算法与实现操作的具体类对应起来。
   安全类
    Security 类保存着提供者的列表,可以逐一查看每个提供者类所支持的操作。

提供安全提供者的公司有 IBM、Bouncy Castle 和 RSA 等,Sun 提供了如何实现你自己提供
者的细节。有些提供者是完全免费的,而另一些提供者则需要付费。

Bouncy Castle 提供了可以在 J2ME/J2EE/J2SE 平台得到支持的 API,而且此 API 是免费的。

Bouncy Castle JCE 的详细信息请参阅 Bouncy Castle 官方网站




4、CAPICOM 概述

4.1 CAPICOM 简介

Windows 操作系统为我们提供了先进的加密体系模型 CryptoAPI,同时该模型也提供了丰富
的函数供第三方开发使用。但使用 CryptoAPI 完成一些通常的操作(如:加密、签名)仍然
是相当复杂的。幸好 MS 同时提供了 CAPICOM 组件,封装了上述的复杂操作,使你只需要
调用一两个函数,就可以完成指定的功能。

CAPICOM 是一个 COM 模型的组件,可以在 Windows 环境下各种语言中使用。而且,
CAPICOM 中的大多数接口都是“脚本安全”的,这意味着你可以在浏览器网页脚本中安全地
使用这些接口所提供的功能。

下面将对 CAPICOM 的功能做简要的介绍。在阅读这个介绍时,我们假设您已经对密码学
知识、COM 模型、脚本编程已经有初步的了解。


4.2 功能和适用环境

目前,CAPICOM 共有两个版本:1.0 版和 2.0 版。其中,后者在前者的基础上,提供了一
些额外的功能。

CAPICOM v1.0 提供如下功能:
 a.产生和验证 PKCS#7 格式的数字签名;
 b.使用证书加密/解密数据;
 c.使用口令加密/解密数据;

CAPICOM v2.0 额外提供如下功能:
 a.产生和验证代码签名;
    b.支持文件形式的证书;
    c.快速证书搜索;
d.产生任意数据的哈希值;
    e.支持 AES 算法(需要 Windows .NET Server 2003 或 Windows XP 支持);
    f.支持高级证书属性,例如:政策、模板。

CAPICOM 是重分发组件,也就是说它没有被包含在操作系统的中,需要单独安装注册该组
件(可以从 MS 那里免费下载);CAPICOM v1.0 要求 Win95、WinNT 4.0 或更高版本,
CAPICOM v2.0 要求 Win98 、WinNT 4.0 + SP4 或更高版本。



4.3 主要功能使用说明

下面对几种常用的加密操作和证书管理功能进行说明。
   哈稀运算
    使用对象:HashedData
    脚本安全。
    注意:需要 CAPICOM v2.0 支持。
   数字信封
    使用对象:EnvelopedData
    脚本安全。
    处理结果符合 PKCS#7 标准。
   数字签名
    使用对象:SignedData
    脚本安全。
    处理结果符合 PKCS#7 标准。
   证书管理
    使用对象:Certificate、Store 等
    脚本安全。
    你可以利用 CAPICOM 提供的一系列证书管理组件完成证书的验证、查询、存储、显示等
    操作。
   内部策略
   算法搜索策略
    CAPICOM 首先检查系统缺省 CSP 是否支持用户指定的算法及密钥长度,如果失败,则搜
    索微软提供的 CSP,并判断其是否支持上面指定的算法和密钥长度。搜索顺序如下:
     a.系统缺省 CSP
     b.Microsoft Enhanced Cryptographic Provider
     c.Microsoft Strong Cryptographic Provider
     d.Microsoft Base Cryptographic Provider
    由上可见,在 CAPICOM 中,我们可以通过自定义 CSP 并提供自己的加密算法,供上层
    应用程序使用。

CAPICOM 的详细信息请参阅 MSDN 官方网站
5、JCE 与 CAPICOM 互通
5.1 互通的原理
CAPICOM 和 JCE 有着各自的体系结构和不同的应用开发接口,但是内部都实现了符合
PKCS 系列规范的信息结构,因此基于二者构建的不同的应用系统之间是可以实现互通的。

PKCS 是由美国 RSA 数据安全公司及其合作伙伴制定的一组公钥密码学标准。其中包括证
书申请、证书更新、证书作废表发布、扩展证书内容以及数字签名、数字信封的格式等方面
的一系列相关协议。

PKCS 协议详细信息请参阅 RSA Security 官方网站




   APP      CAPICOM          PKCS         JCE     APP



  CAPICOM和JCE各自的体系结构和对外的接口都是不同的,但内部都实现了符合PKCS系列规范的交互信息。


                图 5-1 [CAPICOM 与 JCE 应用互通原理图]



5.2 互通示例
5.2.1 数字签名与验证签名

1.总体流程
流程可分为四条支线:
·用 CAPICOM 签名 – 用 CAPICOM 验证签名
·用 CAPICOM 签名 – 用 JCE 验证签名
·用 JCE 签名 – 用 CAPICOM 验证签名
·用 JCE 签名 – 用 JCE 验证签名
④用CAPICOM验证签名



                                                                      ②用JCE签名
    ①用CAPICOM签名




                    SignedData.htm           generateSignedData.jsp



                                                                      ⑥用JCE验证签名




  ③用CAPICOM验证签名    Pop-up webpage             verifySignedData.jsp    ⑤用JCE验证签名




  流程说明
  1.由①至③的流程为用CAPICOM签名,用CAPICOM验证签名。
  2.由①至⑤的流程为用CAPICOM签名,用JCE验证签名。
  3.由②至④的流程为用JCE签名,用CAPICOM验证签名。
  4.由②至⑥的流程为用JCE签名,用JCE验证签名。


                   图 5-2 [签名及验证互通示例 - 总体流程图]



2.用 CAPICOM 签名
·功能:用选择的个人证书对输入的原始报文进行签名(用 CAPICOM)
·代码:参见 SignedData.htm
·流程:当前用户从其个人(自己)证书库中选择一张证书(需带私钥)
    输入待签名的报文
      进行数字签名并弹出验证窗口
SignedData.htm
     CertificateObjectDN [txtCertificate]        select

                                                     ①选择证书
     PlainText [txtPlainText]

       ②输入报文




                                                             [szSignature]
                                                 sign

                                                     ③生成签名
                                                                             Pop-up webpage
         java script using CAPICOM
     function   IsCAPICOMInstalled()
     function   init()
     function   FilterCertificates()
     function   FindCertificateByHash
     function   btnSelectCertificate_OnClick()
     function   btnSignedData_OnClick()




   流程说明
   0.页面载入时调用函数init()
   1.点击[select]按钮调用函数btnSelectCertificate_OnClick() ,弹出窗口选择一张证书用于签名。
   2.选择好证书后 ,文本框CertificateObjectDN中会显示证书主体的DN ,其参数为txtCertificate。
   注:若IE的证书库中当前用户自己的证书只有一个则自动被选择为签名证书。
   3.在文本框PlainText中输入待签名的原始报文 ,其参数为txtPlainText。
   4.点击[sign]按钮调用btnSignedData_OnClick() ,调用选中证书私钥对输入报文进行签名 ,签名
   数据参数为szSignature ;同时弹出一个新页面 ,并将参数szSignature传递给新页面。

                        图 5-3 [签名及验证互通示例 - CAPICOM 签名流程图]



3.用 CAPICOM 验证签名
·功能:验证签名(用 CAPICOM)
·代码:参见 SignedData.htm
·流程:
Pop-up webpage

                                                        [szSignature]
      Signature [szSignature]

            ①显示数字签名
                                                                           SignedData.htm



                                                        [txtSignature]
           verify (CAPICOM)             verify (JCE)

                    ②用CAPICOM验证签名                 ③用JCE验证签名
                                                                         verifySignedData.jsp
          java script using CAPICOM
      function btnVerifySig_OnClick()




   流程说明
   0.页面接收来自SignedData.htm的签名数据 ,其参数为szSignedData。
   1.将此签名数据显示在文本框Signature中 ,并将其赋予表单frm中的参数txtSignedData。
   2.点击[verify (CAPICOM)]按钮调用函数btnVerifySig_OnClick() ,弹出警告窗口提示验证结果。
   3.点击[verify (JCE)]按钮提交表单frm ,跳转到verifySignedData.jsp ,并将参数txtSignature传递
   给该页 ,由该页显示验证结果。

                   图 5-4 [签名及验证互通示例 – CAPICOM 验证签名流程图]



4.用 JCE 签名
·功能:用 KeyStore 中的证书对一串字符进行签名
·代码:参见 generateSignedData. jsp 和 SignedData.java 和 KeyStore.java
·流程:
genarateSignedData.jsp

       Signature [txtSignature]

            ①显示数字签名




                                                           [txtSignature]
           verify (CAPICOM)                verify (JCE)

                    ②用CAPICOM验证签名                    ③用JCE验证签名
                                                                            verifySignedData.jsp
          java script using CAPICOM
      function btnVerifySig_OnClick()
           java bean using class SignedData
      generateSignedData(btPlain,keyStore)
      generateSignedData(btPlain,pvtKey,cert)
      verifySignedData(strSignedData)
      verifySignedData(btSignedData)
          using class KeyStore
      KeyStore(strStore,strStorePwd,strKeyPwd)
      getCertificate()
      getPrivateKey()




    流程说明
    0.页面实例化一个SignedData类的java bean ,名称为signeddata。
    1.初始化密钥库 ,调用KeyStore类的构造方法KeyStore(strStorePath,strStorePwd,strKeyPwd) ,
    方法参数依次为密钥库路径、密钥库密码、私钥密码。
    2.调用signeddata的方法generateSignedData(btPlain,keyStore)生成一个Base64编码的签名 ,
    方法参数依次为原始报文、密钥库。
    3.将签名数据赋予表单frm中的参数txtSignature ,同时在文本框Signature中显示。
    4.点击[verify (CAPICOM)]按钮调用函数btnVerifySig_OnClick() ,弹出警告窗口提示验证结果。
    5.点击[verify (JCE)]按钮提交表单frm ,跳转到verifySignedData.jsp ,并将参数txtSignature传递
    给该页 ,由该页显示验证结果。

                         图 5-5 [签名及验证互通示例 – JCE 签名流程图]



5.用 JCE 验证签名
·功能:验证签名(用 JCE)
·代码:参见 verifySignedData. jsp 和 SignedData.java 和 SignedDataParser.java
·流程:
verifySignedData.jsp
                                                 [txtSignature]
     ObjectDN
     PlainText
     VerifyCode
                                                             generateSignedData.jsp
         ①输出证书信息、原始报文、验证结果

                                                 [txtSignature]



                                                                  Pop-up webpage
         java bean using class SignedData
    generateSignedData(btPlain,keyStore)
    generateSignedData(btPlain,pvtKey,cert)
    verifySignedData(strSignedData)
    verifySignedData(btSignedData)
        java bean using class SignedDataParser
    getPlainTxt()
    getCert()
    parse(strSignedData)
    parse(btSignedData)




  流程说明
  0.页面分别实例化SignedData类和SignedDataParser类的两个java bean ,它们的名称分别为
  signeddata和P7Parser。
  1.调用P7Parser的方法parse(strSignedData)解析签名数据。
  2.分别调用P7Parser的方法getCert()和getPlainTxt()获取证书主体的DN和原始报文并输出。
  3.调用signeddata的方法verifySignedData(strSignedData)验证签名 ,并输出验证结果。

                     图 5-6 [签名及验证互通示例 – JCE 验证签名流程图]




5.2.2 数字信封加密与解密

1.总体流程
流程可分为四条支线:
·用 CAPICOM 加密 – 用 CAPICOM 解密
·用 CAPICOM 加密 – 用 JCE 解密
·用 JCE 加密 – 用 CAPICOM 解密
·用 JCE 加密 – 用 JCE 解密
④用CAPICOM解密



                                                                         ②用JCE加密
    ①用CAPICOM加密




                      Envelope.htm           generateEnvelopedData.jsp



                                                                         ⑥用JCE解密




    ③用CAPICOM解密     Pop-up webpage           decryptEnvelopedData.jsp    ⑤用JCE解密




  流程说明
  1.由①至③的流程为用CAPICOM加密,用CAPICOM解密。
  2.由①至⑤的流程为用CAPICOM加密,用JCE解密。
  3.由②至④的流程为用JCE加密,用CAPICOM解密。
  4.由②至⑥的流程为用JCE加密,用JCE解密。


                  图 5-7 [数字信封加解密互通示例 - 总体流程图]



2.用 CAPICOM 加密
·功能:用选择的其他人证书对输入的原始明文进行数字信封加密(用 CAPICOM)
·代码:参见 Envelope.htm
·流程:当前用户从其个人(其他人)证书库中选择一张证书
    输入待加密的明文
      进行数字信封加密并弹出解密窗口
Envelope.htm
    CertificateObjectDN [txtCertificate]         select

                                                     ①选择证书
    PlainText [txtPlainText]

      ②输入明文




                                                             [szEnvelope]
                                                envelope

                                                     ③生成数字信封
                                                                            Pop-up webpage
        java script using CAPICOM
    function   init()
    function   FilterCertificates()
    function   FindCertificateByHash()
    function   btnSelectCertificate_OnClick()
    function   btnEnvelopedData_OnClick()




  流程说明
  0.页面载入时调用函数init()
  1.点击[select]按钮调用函数btnSelectCertificate_OnClick() ,弹出窗口选择一张证书用于加密。
  2.选择好证书后 ,文本框CertificateObjectDN中会显示证书主体的DN ,其参数为txtCertificate。
  注:若IE的证书库中当前用户的其他人证书只有一个则自动被选择为加密证书。
  3.在文本框PlainText中输入待签名的原始明文 ,其参数为txtPlainText。
  4.点击[envelope]按钮调用btnEnvelopedData_OnClick() ,调用选中证书对输入明文进行加密 ,
  数字信封参数为szEnvelope ;同时弹出一个新页面 ,并将参数szEnvelope传递给新页面。

               图 5-8 [数字信封加解密互通示例 – CAPICOM 数字信封加密流程图]



3.用 CAPICOM 解密
·功能:数字信封解密(用 CAPICOM)
·代码:参见 Envelope.htm
·流程:
Pop-up webpage

                                                          [szEnvelope]
      Envelope [szEnvelope]

            ①显示数字信封
                                                                              Envelope.htm



                                                         [txtEnvelopedData]
          decrypt (CAPICOM)              decrypt (JCE)

                   ②用CAPICOM解密                     ③用JCE解密
                                                                  decryptEnvelopedData.jsp
          java script using CAPICOM
      function btnDecryptEnv_OnClick()




   流程说明
   0.页面接收来自Envelope.htm的签名数据 ,其参数为szEnvelope。
   1.将此数字信封显示在文本框Envelope中 ,并将其赋予表单frm中的参数txtEnvelopedData。
   2.点击[decrypt (CAPICOM)]按钮调用函数btnDecryptEnv_OnClick() ,弹出警告窗口显示明文。
   3.点击[verify (JCE)]按钮提交表单frm ,跳转到decryptEnvelopedData.jsp ,并将参数
   txtEnvelopedData传递给该页 ,由该页显示明文。

              图 5-9 [数字信封加解密互通示例 – CAPICOM 数字信封解密流程图]



4.用 JCE 加密
·功能:用 KeyStore 中的证书对一串字符进行数字信封加密
·代码:参见 generateEnvelopedData. jsp、EnvelopedDataGen.java 和 EnvelpedData.java
·流程:
generateEnvelopedData.jsp

      Envelope [szEnvelope]

            ①显示数字信封




                                                         [txtEnvelopedData]
          decrypt (CAPICOM)              decrypt (JCE)

                   ②用CAPICOM解密                     ③用JCE解密
                                                                  decryptEnvelopedData.jsp
          java script using CAPICOM
      function btnDecryptEnv_OnClick()
          java bean using class EnvelopedData
      decryptEnvelopedData(strEnvelopedData,keyStore)
      decryptEnvelopedData(btEnvelopedData,pvtKey)
      encryptEnvelopedData(btPlain,cert)
      encryptEnvelopedData(btPlain,keyStore)
          using class EnvelopedDataGen
      GenRecipientInfos(cert,btEncryptedKey)
      GenEncryptedContentInfo(btEncryptedContent,btIV)
          using class KeyStore
      KeyStore(strStore,strStorePwd,strKeyPwd)
      getCertificate()
      getPrivateKey()




   流程说明
   0.页面实例化一个EnvelopedData类的java bean ,名称为envelopedData。
   1.初始化密钥库 ,调用KeyStore类的构造方法KeyStore(strStorePath,strStorePwd,strKeyPwd) ,
   方法参数依次为密钥库路径、密钥库密码、私钥密码。
   2.调用envelopedData的方法encryptEnvelopedData(plain, keyStore)生成一个Base64编码的数
   字信封 ,方法参数依次为明文、密钥库。
   3.将数字信封赋予表单frm中的参数txtEnvelopedData ,同时在文本框EnvelopedData中显示。
   4.点击[decrypt (CAPICOM)]按钮调用函数btnDecryptEnv_OnClick() ,弹出警告窗口显示明文。
   5.点击[decrypt (JCE)]按钮提交表单frm ,跳转到decryptEnvelopedData.jsp ,并将参数
   txtEnvelopedData传递给该页 ,由该页显示解密的明文。

                 图 5-10 [数字信封加解密互通示例 – JCE 数字信封加密流程图]



5.用 JCE 解密
·功能:数字信封解密(用 JCE)
·代码:参见 decryptEnvelopedData.jsp 和 EnvelpedData.java
·流程:
decryptEnvelopedData.jsp
                                                      [txtEnvelopedData]
     PlainText

         ①输出明文
                                                              generateEnvelopedData.jsp



                                                      [txtEnvelopedData]



                                                                       Pop-up webpage
        java bean using class EnvelpedData
    decryptEnvelopedData(strEnvelopedData,keyStore)
    decryptEnvelopedData(btEnvelopedData,pvtKey)
    encryptEnvelopedData(strPlain,keyStore)
    encryptEnvelopedData(btPlain,keyStore)
        using class KeyStore
    KeyStore(strStore,strStorePwd,strKeyPwd)
    getCertificate()
    getPrivateKey()




  流程说明
  0.页面实例化EnvelpedData类的java bean ,名称为envelopeddata。
  1.初始化密钥库 ,调用KeyStore类的构造方法KeyStore(strStorePath,strStorePwd,strKeyPwd) ,
  方法参数依次为密钥库路径、密钥库密码、私钥密码。
  2.调用envelopeddata的方法decryptEnvelopedData(strEnvelopedData,keyStore)获取解密明文
  strOut并输出。

                 图 5-11 [数字信封加解密互通示例 – JCE 数字信封解密流程图]




5.3 互通的应用模型

5.3.1 系统登陆

1.架构(B/S)
 ·服务端:基于 JCE
 ·客户端:基于 CAPICOM
·信息格式:符合 PKCS 系列规范

2.流程
 a) 客户端发起一个页面请求,接收到服务端响应后,选取一张本地证书并上传服务端。
b) 服务端验证接收到的客户端证书,若验证通过则继续。
c) 服务端产生一串随机数并记录下来。
d) 服务端建立一个上述客户端证书与随机数的对应关系。
e) 服务端用服务端私钥对这串随机数进行签名。
f) 服务端将服务端证书、随机数、服务端随机数签名一起用客户端证书加密并传给客户端。
g) 客户端用客户端私钥解密收到的数据,得到服务端证书、随机数、服务端随机数签名。
h) 客户端验证得到的服务端证书,若验证通过则继续。
i) 客户端验证得到的服务端随机数签名,若验证通过则继续。
j) 客户端用客户端私钥对得到的随机数进行签名。
k) 客户端将客户端证书、随机数、客户端随机数签名一起用服务端证书加密并传给服务端。
l) 服务端用服务端私钥解密收到的数据,得到客户端证书、随机数、客户端随机数签名。
m) 服务端比对并验证得到的客户端证书,若比对和验证通过则继续。
n) 服务端比对得到的随机数并验证得到的客户端随机数签名,若比对和验证通过则继续。
o) 服务端取客户端证书中特定的项目或项目组合,与系统用户数据库中相应的项目比对。
p) 若比对通过则相应客户端的登陆请求,用户巨额可成功登陆,继续进行业务操作。
Client        CAPICOM                           JCE           Server

  1. 用户发起页面请求                request for page

                                 客户端证书



                                                  2. 验证客户端证书
                                                  3. 产生一串随机数并记录下来
                                                  4. 将此随机数与客户端证书对应
                                                  5. 用服务端私钥对随机数签名
                             response for page
                                                  6. 用客户端证书加密发送数据
                            服务端证书  随机数
                             服务端随机数签名




  7. 用客户端私钥解密接收数据
  8. 验证服务端证书
  9. 验证服务端随机数签名
  10.用客户端私钥对随机数签名
                             request for access
  11.用服务端证书加密发送数据
                            客户端证书  随机数
                             客户端随机数签名




                                                  12. 用服务端私钥解密接受数据
                                                  13. 验证客户端证书
                                                  14. 验证随机数
                                                  15. 验证客户端随机数签名
                                                  16. 验证客户端证书指定细目
                            response for access
                                                  17. 服务端响应登陆请求



                               业务应用交互




  说明
  [3-4]将接收到的客户端证书与服务端针对本次会话生成的随机数对应起来以备后续验证
  [13-14]除验证客户端证书有效性外,还需比对其是否为先前接收到的证书,并比对随机数是否为先前生成的相应的随机数
  [16]取客户端证书中特定的细目或细目的组合,如Subject,SubjectUID,IssuerUID等等,进行进一步的身份验证


                 图 5-12 [互通应用模型 – 系统登陆模型流程图]
注:也可将业务应用中所有用户的证书存放在服务端数据库中, Unique Identifier(UID)
                            由
或其他唯一标识指定,用户访问时只需要上送这个标识即可对应其用户的证书和帐户。

More Related Content

Viewers also liked

Viewers also liked (20)

Fotografico
FotograficoFotografico
Fotografico
 
【自然科学研究機構】平成19年環境報告書Pdf
【自然科学研究機構】平成19年環境報告書Pdf【自然科学研究機構】平成19年環境報告書Pdf
【自然科学研究機構】平成19年環境報告書Pdf
 
Human Power Pump
Human Power PumpHuman Power Pump
Human Power Pump
 
Roumanie8a
Roumanie8aRoumanie8a
Roumanie8a
 
Balade Roumaine
Balade RoumaineBalade Roumaine
Balade Roumaine
 
Gibraltari Szoros Algeciras
Gibraltari Szoros AlgecirasGibraltari Szoros Algeciras
Gibraltari Szoros Algeciras
 
Norma Tecnica De Anestesiologia
Norma Tecnica De AnestesiologiaNorma Tecnica De Anestesiologia
Norma Tecnica De Anestesiologia
 
Workwear
WorkwearWorkwear
Workwear
 
Web 2
Web 2Web 2
Web 2
 
Cuadro
CuadroCuadro
Cuadro
 
M E V L A N A
M E V L A N AM E V L A N A
M E V L A N A
 
Cuadro
CuadroCuadro
Cuadro
 
Cuadro
CuadroCuadro
Cuadro
 
Hydraulic Robot Arm
Hydraulic Robot ArmHydraulic Robot Arm
Hydraulic Robot Arm
 
Peles KastéLy RomáNia Monus
Peles KastéLy RomáNia   MonusPeles KastéLy RomáNia   Monus
Peles KastéLy RomáNia Monus
 
Curtea Gabriel
Curtea GabrielCurtea Gabriel
Curtea Gabriel
 
A ÉPICA LATINA
A ÉPICA LATINAA ÉPICA LATINA
A ÉPICA LATINA
 
Informatica1
Informatica1Informatica1
Informatica1
 
Ditre Italia Leather kit
Ditre Italia Leather kitDitre Italia Leather kit
Ditre Italia Leather kit
 
111109
111109111109
111109
 

Similar to 如何使用JCE和CAPICOM进行加密和签名

0502 Windwos Server 2008 Card Space 新一代身份驗證機制
0502 Windwos Server 2008 Card Space 新一代身份驗證機制0502 Windwos Server 2008 Card Space 新一代身份驗證機制
0502 Windwos Server 2008 Card Space 新一代身份驗證機制Timothy Chen
 
Cas Sso Intro
Cas Sso IntroCas Sso Intro
Cas Sso IntroShiny Zhu
 
利用Signalr打造即時通訊@Tech day geek
利用Signalr打造即時通訊@Tech day geek利用Signalr打造即時通訊@Tech day geek
利用Signalr打造即時通訊@Tech day geekJohnson Gau
 
高性能远程调用解决方案
高性能远程调用解决方案高性能远程调用解决方案
高性能远程调用解决方案Ady Liu
 
淘宝开放产品前端实践
淘宝开放产品前端实践淘宝开放产品前端实践
淘宝开放产品前端实践taobao.com
 
存量房银行按揭接口客户端系统建设方案V1.0
存量房银行按揭接口客户端系统建设方案V1.0存量房银行按揭接口客户端系统建设方案V1.0
存量房银行按揭接口客户端系统建设方案V1.0hupo136
 
利用OpenSSL创建并验证证书
利用OpenSSL创建并验证证书利用OpenSSL创建并验证证书
利用OpenSSL创建并验证证书Water Sky
 
ASP.NET Core 2.1設計新思維與新發展
ASP.NET  Core 2.1設計新思維與新發展ASP.NET  Core 2.1設計新思維與新發展
ASP.NET Core 2.1設計新思維與新發展江華 奚
 
基于Silverlight的RIA架构及百度应用
基于Silverlight的RIA架构及百度应用基于Silverlight的RIA架构及百度应用
基于Silverlight的RIA架构及百度应用Cat Chen
 
Android账户同步备份框架 | 盛大乐众ROM 郭振
Android账户同步备份框架 | 盛大乐众ROM 郭振 Android账户同步备份框架 | 盛大乐众ROM 郭振
Android账户同步备份框架 | 盛大乐众ROM 郭振 imShining @DevCamp
 
腾讯大讲堂46 自由cgi之路v3
腾讯大讲堂46 自由cgi之路v3腾讯大讲堂46 自由cgi之路v3
腾讯大讲堂46 自由cgi之路v3areyouok
 
腾讯大讲堂46 自由cgi之路v3
腾讯大讲堂46 自由cgi之路v3腾讯大讲堂46 自由cgi之路v3
腾讯大讲堂46 自由cgi之路v3topgeek
 
云计算可信评估方法研究
云计算可信评估方法研究云计算可信评估方法研究
云计算可信评估方法研究iamafan
 
通行证项目技术分享
通行证项目技术分享通行证项目技术分享
通行证项目技术分享Tony Deng
 
ASP.NET Core MVC 2.2從開發到測試 - Development & Unit Testing
ASP.NET Core MVC 2.2從開發到測試 - Development & Unit TestingASP.NET Core MVC 2.2從開發到測試 - Development & Unit Testing
ASP.NET Core MVC 2.2從開發到測試 - Development & Unit Testing江華 奚
 
電腦網路 網路安全
電腦網路 網路安全電腦網路 網路安全
電腦網路 網路安全bruce761207
 

Similar to 如何使用JCE和CAPICOM进行加密和签名 (20)

0502 Windwos Server 2008 Card Space 新一代身份驗證機制
0502 Windwos Server 2008 Card Space 新一代身份驗證機制0502 Windwos Server 2008 Card Space 新一代身份驗證機制
0502 Windwos Server 2008 Card Space 新一代身份驗證機制
 
Cas Sso Intro
Cas Sso IntroCas Sso Intro
Cas Sso Intro
 
利用Signalr打造即時通訊@Tech day geek
利用Signalr打造即時通訊@Tech day geek利用Signalr打造即時通訊@Tech day geek
利用Signalr打造即時通訊@Tech day geek
 
高性能远程调用解决方案
高性能远程调用解决方案高性能远程调用解决方案
高性能远程调用解决方案
 
淘宝开放产品前端实践
淘宝开放产品前端实践淘宝开放产品前端实践
淘宝开放产品前端实践
 
存量房银行按揭接口客户端系统建设方案V1.0
存量房银行按揭接口客户端系统建设方案V1.0存量房银行按揭接口客户端系统建设方案V1.0
存量房银行按揭接口客户端系统建设方案V1.0
 
利用OpenSSL创建并验证证书
利用OpenSSL创建并验证证书利用OpenSSL创建并验证证书
利用OpenSSL创建并验证证书
 
ASP.NET Core 2.1設計新思維與新發展
ASP.NET  Core 2.1設計新思維與新發展ASP.NET  Core 2.1設計新思維與新發展
ASP.NET Core 2.1設計新思維與新發展
 
憑證
憑證憑證
憑證
 
CAREY-Tech SSO
CAREY-Tech SSOCAREY-Tech SSO
CAREY-Tech SSO
 
基于Silverlight的RIA架构及百度应用
基于Silverlight的RIA架构及百度应用基于Silverlight的RIA架构及百度应用
基于Silverlight的RIA架构及百度应用
 
Android账户同步备份框架 | 盛大乐众ROM 郭振
Android账户同步备份框架 | 盛大乐众ROM 郭振 Android账户同步备份框架 | 盛大乐众ROM 郭振
Android账户同步备份框架 | 盛大乐众ROM 郭振
 
腾讯大讲堂46 自由cgi之路v3
腾讯大讲堂46 自由cgi之路v3腾讯大讲堂46 自由cgi之路v3
腾讯大讲堂46 自由cgi之路v3
 
腾讯大讲堂46 自由cgi之路v3
腾讯大讲堂46 自由cgi之路v3腾讯大讲堂46 自由cgi之路v3
腾讯大讲堂46 自由cgi之路v3
 
云计算可信评估方法研究
云计算可信评估方法研究云计算可信评估方法研究
云计算可信评估方法研究
 
通行证项目技术分享
通行证项目技术分享通行证项目技术分享
通行证项目技术分享
 
ASP.NET Core MVC 2.2從開發到測試 - Development & Unit Testing
ASP.NET Core MVC 2.2從開發到測試 - Development & Unit TestingASP.NET Core MVC 2.2從開發到測試 - Development & Unit Testing
ASP.NET Core MVC 2.2從開發到測試 - Development & Unit Testing
 
電腦網路 網路安全
電腦網路 網路安全電腦網路 網路安全
電腦網路 網路安全
 
網路安全
網路安全網路安全
網路安全
 
網路安全
網路安全網路安全
網路安全
 

如何使用JCE和CAPICOM进行加密和签名

  • 1. 1、概述 本技术书分别对 JCE 与 CAPICOM 各自的背景、体系和一些细节进行了介绍。同时介绍了 基于 JCE 和 CAPICOM 接口的安全基础应用(包括加解密和数字签名)实现互通的原理, 并提供了一套示例系统,详细说明了其设计思路、具体流程以及源代码,最后给出基于 JCE 和 CAPICOM 安全接口互通应用构建的参考模型。 本技术书通过对 JCE 和 CAPICOM 安全接口之间互通的介绍,从证书在各种应用环境下的 格式、包含的内容、应用进行了全面的分析。上海 CA 中心在系统的研发上精益求精,注重 安全性、功能性、易用性和实效性,保证了证书认证系统能够满足运营和操作的需求,保证 了其有效、可靠、安全。 2、证书格式介绍 X.509 目前有三个版本:V1、V2 和 V3。 X.509 V1 和 V2 证书所包含的主要内容如下:  证书版本号(Version) 版本号指明 X.509 证书的格式版本,现在的值可以为 0、1、2,也为将来的版本进行了预 定义。  证书序列号(SerialNumber) 序列号指定由 CA 分配给证书的唯一的数字型标识符。当证书被取消时,实际上是将此证 书的序列号放入由 CA 签发的 CRL 中,这也是序列号唯一的原因。  签名算法标识符(Signature) 签名算法标识用来指定由 CA 签发证书时所使用的签名算法。算法标识符用来指定 CA 签 发证书时所使用的公开密钥算法和 hash 算法,须向国际知名标准组织(如 ISO)注册。  签发机构名(Issuer) 此域用来标识签发证书的 CA 的 X.500 DN 名字。包括国家、省市、地区、组织机构、单 位部门和通用名。  有效期(Validity) 指定证书的有效期,包括证书开始生效的日期和时间以及失效的日期和时间。每次使用证 书时,需要检查证书是否在有效期内。  证书用户名(Subject) 指定证书持有者的 X.500 唯一名字。包括国家、省市、地区、组织机构、单位部门和通用 名,还可包含 email 地址等个人信息等。  证书持有者公开密钥信息(subjectPublicKeyInfo) 证书持有者公开密钥信息域包含两个重要信息:证书持有者的公开密钥的值;公开密钥使 用的算法标识符。此标识符包含公开密钥算法和 hash 算法。  签发者唯一标识符(Issuer Unique Identifier) 签发者唯一标识符在第 2 版加入证书定义中。 此域用在当同一个 X.500 名字用于多个认证
  • 2. 机构时,用一比特字符串来唯一标识签发者的 X.500 名字。可选。  证书持有者唯一标识符(Subject Unique Identifier) 持有证书者唯一标识符在第 2 版的标准中加入 X.509 证书定义。此域用在当同一个 X.500 名字用于多个证书持有者时, 用一比特字符串来唯一标识证书持有者的 X.500 名字。 可选。  签名值(Issuer's Signature) 证书签发机构对证书上述内容的签名值。 X.509 V3 证书是在 v2 的基础上一标准形式或普通形式增加了扩展项,以使证书能够附带额 外信息。标准扩展是指由 X.509 V3 版本定义的对 V2 版本增加的具有广泛应用前景的扩展 项,任何人都可以向一些权威机构,如 ISO,来注册一些其他扩展,如果这些扩展项应用广 泛,也许以后会成为标准扩展项。 3、JCE 概述 3.1 JAVA 安全体系 Java 体系结构对安全性的支持主要是通过 Java 语言本身安全性、虚拟机的类加载器和 安全管理器以及 Java 提供的安全 API 几个方面来实现:防止恶意程序的攻击,程序不能 破坏用户计算机环境;防止入侵,程序不能获取主机或所在内网的保密信息;鉴别,验 证程序提供者和使用者的身份;加密,对传输交换的数据进行加密,或者给持久化的数 据进行加密;验证,对操作设置规则并且进行验证。 JAVA 安全框架提供了三类主要的安全 API:  Java 认证和授权服务 (Java Authentication and Authorization Service, JAAS) 提供了一种灵活的、 说明性的机制, 用于对用户进行认证并验证他们访问安全资源的能力。  Java 安全套接字扩展 (Java Secure Socket Extension, JSSE) 定义了通过安全套接字层(SSL)进行安全 Web 通信的一种全 Java 的机制。  Java 加密扩展 (Java Cryptography Extension, JCE) 提供了加密、 密钥产生、 密钥协议、 验证算法的开发基础, 以及常用加密算法的实现方案。 目前 JAAS、JSSE 与 JCE 已经被集成到 1.4 以上版本的 Java 平台中。 3.2 JCE 简介 Java 平台为安全和加密服务提供了两组 API:JCA 和 JCE。 JCA (Java Cryptography Architecture)提供基本的加密框架,如证书、数字签名、消息摘要和 密钥对产生器。 JCE(Java Cryptography Extension) 在 JCA 的基础上作了扩展,包括加密算法、密钥交换、密 钥产生和消息鉴别服务等接口。JCE 支持多种类型的加密,包括对称的、非对称的、块和流
  • 3. 密码。 JCE 共有 3 个包、26 个类、4 个接口和 4 个异常。主要如下:  密钥 Key 接口(java.security.Key)实现了密钥概念的模型化。 KeyPair 类(java.security.KeyPair)是对非对称密钥的扩展,是一个数据结构类。 KeyPairGenerator 类(java.security.KeyPairGenerator)用于生成非对称密钥。 KeyGenerator 类(java.crypto.KeyGenerator)用于生成秘密密钥。 KeyFactory 类(java.security.KeyFactory)用于转换非对称密钥。 SecretKeyFactory 类(javax.crypto.SecretKeyFactory)用于转换秘密密钥。  证书 Certificate 类(java.security.cert.Certificate)提供一种基础设施以支持对证书必要的操作。 CertificateFactory 类(java.security.cert.CertificateFactory)用于导入指定类型的证书。 X509 Certificate 类(java.security.cert.X509Certificate)支持 X509 3 格式的证书。  密钥管理 KeyStore 类(java.security.KeyStore)表示一组私钥、别名/实体及其对应的证书。 KeyAgreement 类(javax.crypto.KeyAgreement)用于秘密密钥的分发。  消息摘要 MessageDigest 类(java.security.MessageDigest)实现创建和验证消息摘要的操作。 Mac 类(javax.crypto.Mac)实现创建和验证安全消息摘要/消息鉴别码的操作。 DigestOutputStream 类(java.security.DigestOutputStream)提供与信息摘要相关的输出流。 DigestInputStream 类(java.security.DigestInputStream)提供与信息摘要相关的输入流。  数字签名 Signature 类(java.security.Signature)用于数字签名的创建与验证。 SignedObject 类(java.security.SignedObject)用于可序列化对象与数字签名的封装。  加密解密 Cipher 类(javax.crypto.Cipher)用于加密/解密以及密钥封装。 CipherOutputStream 类(javax.crypto.CipherOutputStream)用于将输出数据加密后放入流中。 CipherInputStream 类(javax.crypto.CipherInputStream)用于从流中读取数据并解密。 SealedObject 类(javax.crypto.SealedObject)用于可序列化队形加密封存。 Sun JCE 的详细信息请参阅 Java 官方网站 3.3 安全提供者 安全提供者是用来管理安全软件包中所用的各种引擎、与这些引擎相对应的合法算法、以及 任何 Java 虚拟机都可以得到的算法/引擎对的具体实现。 安全提供者体系结构:  引擎类 Java 虚拟机提供引擎类,它们是核心 API 的一部分。引擎是程序员所能执行的一个操作, 它往往是抽象的,且与具体的算法实现无关。  算法类 基本上针对每一种引擎都有一组类实现相关的算法。Java 平台提供了一组默认的算法类,
  • 4. 其他第三方机构可提供另外的算法类。这些类可提供一个或多个算法以实现相应的引擎。  提供者类 开发商所提供的每组算法类是利用 Provider 类的一个实例进行管理的。提供者知道如何将 算法与实现操作的具体类对应起来。  安全类 Security 类保存着提供者的列表,可以逐一查看每个提供者类所支持的操作。 提供安全提供者的公司有 IBM、Bouncy Castle 和 RSA 等,Sun 提供了如何实现你自己提供 者的细节。有些提供者是完全免费的,而另一些提供者则需要付费。 Bouncy Castle 提供了可以在 J2ME/J2EE/J2SE 平台得到支持的 API,而且此 API 是免费的。 Bouncy Castle JCE 的详细信息请参阅 Bouncy Castle 官方网站 4、CAPICOM 概述 4.1 CAPICOM 简介 Windows 操作系统为我们提供了先进的加密体系模型 CryptoAPI,同时该模型也提供了丰富 的函数供第三方开发使用。但使用 CryptoAPI 完成一些通常的操作(如:加密、签名)仍然 是相当复杂的。幸好 MS 同时提供了 CAPICOM 组件,封装了上述的复杂操作,使你只需要 调用一两个函数,就可以完成指定的功能。 CAPICOM 是一个 COM 模型的组件,可以在 Windows 环境下各种语言中使用。而且, CAPICOM 中的大多数接口都是“脚本安全”的,这意味着你可以在浏览器网页脚本中安全地 使用这些接口所提供的功能。 下面将对 CAPICOM 的功能做简要的介绍。在阅读这个介绍时,我们假设您已经对密码学 知识、COM 模型、脚本编程已经有初步的了解。 4.2 功能和适用环境 目前,CAPICOM 共有两个版本:1.0 版和 2.0 版。其中,后者在前者的基础上,提供了一 些额外的功能。 CAPICOM v1.0 提供如下功能: a.产生和验证 PKCS#7 格式的数字签名; b.使用证书加密/解密数据; c.使用口令加密/解密数据; CAPICOM v2.0 额外提供如下功能: a.产生和验证代码签名; b.支持文件形式的证书; c.快速证书搜索;
  • 5. d.产生任意数据的哈希值; e.支持 AES 算法(需要 Windows .NET Server 2003 或 Windows XP 支持); f.支持高级证书属性,例如:政策、模板。 CAPICOM 是重分发组件,也就是说它没有被包含在操作系统的中,需要单独安装注册该组 件(可以从 MS 那里免费下载);CAPICOM v1.0 要求 Win95、WinNT 4.0 或更高版本, CAPICOM v2.0 要求 Win98 、WinNT 4.0 + SP4 或更高版本。 4.3 主要功能使用说明 下面对几种常用的加密操作和证书管理功能进行说明。  哈稀运算 使用对象:HashedData 脚本安全。 注意:需要 CAPICOM v2.0 支持。  数字信封 使用对象:EnvelopedData 脚本安全。 处理结果符合 PKCS#7 标准。  数字签名 使用对象:SignedData 脚本安全。 处理结果符合 PKCS#7 标准。  证书管理 使用对象:Certificate、Store 等 脚本安全。 你可以利用 CAPICOM 提供的一系列证书管理组件完成证书的验证、查询、存储、显示等 操作。  内部策略  算法搜索策略 CAPICOM 首先检查系统缺省 CSP 是否支持用户指定的算法及密钥长度,如果失败,则搜 索微软提供的 CSP,并判断其是否支持上面指定的算法和密钥长度。搜索顺序如下: a.系统缺省 CSP b.Microsoft Enhanced Cryptographic Provider c.Microsoft Strong Cryptographic Provider d.Microsoft Base Cryptographic Provider 由上可见,在 CAPICOM 中,我们可以通过自定义 CSP 并提供自己的加密算法,供上层 应用程序使用。 CAPICOM 的详细信息请参阅 MSDN 官方网站
  • 6. 5、JCE 与 CAPICOM 互通 5.1 互通的原理 CAPICOM 和 JCE 有着各自的体系结构和不同的应用开发接口,但是内部都实现了符合 PKCS 系列规范的信息结构,因此基于二者构建的不同的应用系统之间是可以实现互通的。 PKCS 是由美国 RSA 数据安全公司及其合作伙伴制定的一组公钥密码学标准。其中包括证 书申请、证书更新、证书作废表发布、扩展证书内容以及数字签名、数字信封的格式等方面 的一系列相关协议。 PKCS 协议详细信息请参阅 RSA Security 官方网站 APP CAPICOM PKCS JCE APP CAPICOM和JCE各自的体系结构和对外的接口都是不同的,但内部都实现了符合PKCS系列规范的交互信息。 图 5-1 [CAPICOM 与 JCE 应用互通原理图] 5.2 互通示例 5.2.1 数字签名与验证签名 1.总体流程 流程可分为四条支线: ·用 CAPICOM 签名 – 用 CAPICOM 验证签名 ·用 CAPICOM 签名 – 用 JCE 验证签名 ·用 JCE 签名 – 用 CAPICOM 验证签名 ·用 JCE 签名 – 用 JCE 验证签名
  • 7. ④用CAPICOM验证签名 ②用JCE签名 ①用CAPICOM签名 SignedData.htm generateSignedData.jsp ⑥用JCE验证签名 ③用CAPICOM验证签名 Pop-up webpage verifySignedData.jsp ⑤用JCE验证签名 流程说明 1.由①至③的流程为用CAPICOM签名,用CAPICOM验证签名。 2.由①至⑤的流程为用CAPICOM签名,用JCE验证签名。 3.由②至④的流程为用JCE签名,用CAPICOM验证签名。 4.由②至⑥的流程为用JCE签名,用JCE验证签名。 图 5-2 [签名及验证互通示例 - 总体流程图] 2.用 CAPICOM 签名 ·功能:用选择的个人证书对输入的原始报文进行签名(用 CAPICOM) ·代码:参见 SignedData.htm ·流程:当前用户从其个人(自己)证书库中选择一张证书(需带私钥) 输入待签名的报文 进行数字签名并弹出验证窗口
  • 8. SignedData.htm CertificateObjectDN [txtCertificate] select ①选择证书 PlainText [txtPlainText] ②输入报文 [szSignature] sign ③生成签名 Pop-up webpage java script using CAPICOM function IsCAPICOMInstalled() function init() function FilterCertificates() function FindCertificateByHash function btnSelectCertificate_OnClick() function btnSignedData_OnClick() 流程说明 0.页面载入时调用函数init() 1.点击[select]按钮调用函数btnSelectCertificate_OnClick() ,弹出窗口选择一张证书用于签名。 2.选择好证书后 ,文本框CertificateObjectDN中会显示证书主体的DN ,其参数为txtCertificate。 注:若IE的证书库中当前用户自己的证书只有一个则自动被选择为签名证书。 3.在文本框PlainText中输入待签名的原始报文 ,其参数为txtPlainText。 4.点击[sign]按钮调用btnSignedData_OnClick() ,调用选中证书私钥对输入报文进行签名 ,签名 数据参数为szSignature ;同时弹出一个新页面 ,并将参数szSignature传递给新页面。 图 5-3 [签名及验证互通示例 - CAPICOM 签名流程图] 3.用 CAPICOM 验证签名 ·功能:验证签名(用 CAPICOM) ·代码:参见 SignedData.htm ·流程:
  • 9. Pop-up webpage [szSignature] Signature [szSignature] ①显示数字签名 SignedData.htm [txtSignature] verify (CAPICOM) verify (JCE) ②用CAPICOM验证签名 ③用JCE验证签名 verifySignedData.jsp java script using CAPICOM function btnVerifySig_OnClick() 流程说明 0.页面接收来自SignedData.htm的签名数据 ,其参数为szSignedData。 1.将此签名数据显示在文本框Signature中 ,并将其赋予表单frm中的参数txtSignedData。 2.点击[verify (CAPICOM)]按钮调用函数btnVerifySig_OnClick() ,弹出警告窗口提示验证结果。 3.点击[verify (JCE)]按钮提交表单frm ,跳转到verifySignedData.jsp ,并将参数txtSignature传递 给该页 ,由该页显示验证结果。 图 5-4 [签名及验证互通示例 – CAPICOM 验证签名流程图] 4.用 JCE 签名 ·功能:用 KeyStore 中的证书对一串字符进行签名 ·代码:参见 generateSignedData. jsp 和 SignedData.java 和 KeyStore.java ·流程:
  • 10. genarateSignedData.jsp Signature [txtSignature] ①显示数字签名 [txtSignature] verify (CAPICOM) verify (JCE) ②用CAPICOM验证签名 ③用JCE验证签名 verifySignedData.jsp java script using CAPICOM function btnVerifySig_OnClick() java bean using class SignedData generateSignedData(btPlain,keyStore) generateSignedData(btPlain,pvtKey,cert) verifySignedData(strSignedData) verifySignedData(btSignedData) using class KeyStore KeyStore(strStore,strStorePwd,strKeyPwd) getCertificate() getPrivateKey() 流程说明 0.页面实例化一个SignedData类的java bean ,名称为signeddata。 1.初始化密钥库 ,调用KeyStore类的构造方法KeyStore(strStorePath,strStorePwd,strKeyPwd) , 方法参数依次为密钥库路径、密钥库密码、私钥密码。 2.调用signeddata的方法generateSignedData(btPlain,keyStore)生成一个Base64编码的签名 , 方法参数依次为原始报文、密钥库。 3.将签名数据赋予表单frm中的参数txtSignature ,同时在文本框Signature中显示。 4.点击[verify (CAPICOM)]按钮调用函数btnVerifySig_OnClick() ,弹出警告窗口提示验证结果。 5.点击[verify (JCE)]按钮提交表单frm ,跳转到verifySignedData.jsp ,并将参数txtSignature传递 给该页 ,由该页显示验证结果。 图 5-5 [签名及验证互通示例 – JCE 签名流程图] 5.用 JCE 验证签名 ·功能:验证签名(用 JCE) ·代码:参见 verifySignedData. jsp 和 SignedData.java 和 SignedDataParser.java ·流程:
  • 11. verifySignedData.jsp [txtSignature] ObjectDN PlainText VerifyCode generateSignedData.jsp ①输出证书信息、原始报文、验证结果 [txtSignature] Pop-up webpage java bean using class SignedData generateSignedData(btPlain,keyStore) generateSignedData(btPlain,pvtKey,cert) verifySignedData(strSignedData) verifySignedData(btSignedData) java bean using class SignedDataParser getPlainTxt() getCert() parse(strSignedData) parse(btSignedData) 流程说明 0.页面分别实例化SignedData类和SignedDataParser类的两个java bean ,它们的名称分别为 signeddata和P7Parser。 1.调用P7Parser的方法parse(strSignedData)解析签名数据。 2.分别调用P7Parser的方法getCert()和getPlainTxt()获取证书主体的DN和原始报文并输出。 3.调用signeddata的方法verifySignedData(strSignedData)验证签名 ,并输出验证结果。 图 5-6 [签名及验证互通示例 – JCE 验证签名流程图] 5.2.2 数字信封加密与解密 1.总体流程 流程可分为四条支线: ·用 CAPICOM 加密 – 用 CAPICOM 解密 ·用 CAPICOM 加密 – 用 JCE 解密 ·用 JCE 加密 – 用 CAPICOM 解密 ·用 JCE 加密 – 用 JCE 解密
  • 12. ④用CAPICOM解密 ②用JCE加密 ①用CAPICOM加密 Envelope.htm generateEnvelopedData.jsp ⑥用JCE解密 ③用CAPICOM解密 Pop-up webpage decryptEnvelopedData.jsp ⑤用JCE解密 流程说明 1.由①至③的流程为用CAPICOM加密,用CAPICOM解密。 2.由①至⑤的流程为用CAPICOM加密,用JCE解密。 3.由②至④的流程为用JCE加密,用CAPICOM解密。 4.由②至⑥的流程为用JCE加密,用JCE解密。 图 5-7 [数字信封加解密互通示例 - 总体流程图] 2.用 CAPICOM 加密 ·功能:用选择的其他人证书对输入的原始明文进行数字信封加密(用 CAPICOM) ·代码:参见 Envelope.htm ·流程:当前用户从其个人(其他人)证书库中选择一张证书 输入待加密的明文 进行数字信封加密并弹出解密窗口
  • 13. Envelope.htm CertificateObjectDN [txtCertificate] select ①选择证书 PlainText [txtPlainText] ②输入明文 [szEnvelope] envelope ③生成数字信封 Pop-up webpage java script using CAPICOM function init() function FilterCertificates() function FindCertificateByHash() function btnSelectCertificate_OnClick() function btnEnvelopedData_OnClick() 流程说明 0.页面载入时调用函数init() 1.点击[select]按钮调用函数btnSelectCertificate_OnClick() ,弹出窗口选择一张证书用于加密。 2.选择好证书后 ,文本框CertificateObjectDN中会显示证书主体的DN ,其参数为txtCertificate。 注:若IE的证书库中当前用户的其他人证书只有一个则自动被选择为加密证书。 3.在文本框PlainText中输入待签名的原始明文 ,其参数为txtPlainText。 4.点击[envelope]按钮调用btnEnvelopedData_OnClick() ,调用选中证书对输入明文进行加密 , 数字信封参数为szEnvelope ;同时弹出一个新页面 ,并将参数szEnvelope传递给新页面。 图 5-8 [数字信封加解密互通示例 – CAPICOM 数字信封加密流程图] 3.用 CAPICOM 解密 ·功能:数字信封解密(用 CAPICOM) ·代码:参见 Envelope.htm ·流程:
  • 14. Pop-up webpage [szEnvelope] Envelope [szEnvelope] ①显示数字信封 Envelope.htm [txtEnvelopedData] decrypt (CAPICOM) decrypt (JCE) ②用CAPICOM解密 ③用JCE解密 decryptEnvelopedData.jsp java script using CAPICOM function btnDecryptEnv_OnClick() 流程说明 0.页面接收来自Envelope.htm的签名数据 ,其参数为szEnvelope。 1.将此数字信封显示在文本框Envelope中 ,并将其赋予表单frm中的参数txtEnvelopedData。 2.点击[decrypt (CAPICOM)]按钮调用函数btnDecryptEnv_OnClick() ,弹出警告窗口显示明文。 3.点击[verify (JCE)]按钮提交表单frm ,跳转到decryptEnvelopedData.jsp ,并将参数 txtEnvelopedData传递给该页 ,由该页显示明文。 图 5-9 [数字信封加解密互通示例 – CAPICOM 数字信封解密流程图] 4.用 JCE 加密 ·功能:用 KeyStore 中的证书对一串字符进行数字信封加密 ·代码:参见 generateEnvelopedData. jsp、EnvelopedDataGen.java 和 EnvelpedData.java ·流程:
  • 15. generateEnvelopedData.jsp Envelope [szEnvelope] ①显示数字信封 [txtEnvelopedData] decrypt (CAPICOM) decrypt (JCE) ②用CAPICOM解密 ③用JCE解密 decryptEnvelopedData.jsp java script using CAPICOM function btnDecryptEnv_OnClick() java bean using class EnvelopedData decryptEnvelopedData(strEnvelopedData,keyStore) decryptEnvelopedData(btEnvelopedData,pvtKey) encryptEnvelopedData(btPlain,cert) encryptEnvelopedData(btPlain,keyStore) using class EnvelopedDataGen GenRecipientInfos(cert,btEncryptedKey) GenEncryptedContentInfo(btEncryptedContent,btIV) using class KeyStore KeyStore(strStore,strStorePwd,strKeyPwd) getCertificate() getPrivateKey() 流程说明 0.页面实例化一个EnvelopedData类的java bean ,名称为envelopedData。 1.初始化密钥库 ,调用KeyStore类的构造方法KeyStore(strStorePath,strStorePwd,strKeyPwd) , 方法参数依次为密钥库路径、密钥库密码、私钥密码。 2.调用envelopedData的方法encryptEnvelopedData(plain, keyStore)生成一个Base64编码的数 字信封 ,方法参数依次为明文、密钥库。 3.将数字信封赋予表单frm中的参数txtEnvelopedData ,同时在文本框EnvelopedData中显示。 4.点击[decrypt (CAPICOM)]按钮调用函数btnDecryptEnv_OnClick() ,弹出警告窗口显示明文。 5.点击[decrypt (JCE)]按钮提交表单frm ,跳转到decryptEnvelopedData.jsp ,并将参数 txtEnvelopedData传递给该页 ,由该页显示解密的明文。 图 5-10 [数字信封加解密互通示例 – JCE 数字信封加密流程图] 5.用 JCE 解密 ·功能:数字信封解密(用 JCE) ·代码:参见 decryptEnvelopedData.jsp 和 EnvelpedData.java ·流程:
  • 16. decryptEnvelopedData.jsp [txtEnvelopedData] PlainText ①输出明文 generateEnvelopedData.jsp [txtEnvelopedData] Pop-up webpage java bean using class EnvelpedData decryptEnvelopedData(strEnvelopedData,keyStore) decryptEnvelopedData(btEnvelopedData,pvtKey) encryptEnvelopedData(strPlain,keyStore) encryptEnvelopedData(btPlain,keyStore) using class KeyStore KeyStore(strStore,strStorePwd,strKeyPwd) getCertificate() getPrivateKey() 流程说明 0.页面实例化EnvelpedData类的java bean ,名称为envelopeddata。 1.初始化密钥库 ,调用KeyStore类的构造方法KeyStore(strStorePath,strStorePwd,strKeyPwd) , 方法参数依次为密钥库路径、密钥库密码、私钥密码。 2.调用envelopeddata的方法decryptEnvelopedData(strEnvelopedData,keyStore)获取解密明文 strOut并输出。 图 5-11 [数字信封加解密互通示例 – JCE 数字信封解密流程图] 5.3 互通的应用模型 5.3.1 系统登陆 1.架构(B/S) ·服务端:基于 JCE ·客户端:基于 CAPICOM ·信息格式:符合 PKCS 系列规范 2.流程 a) 客户端发起一个页面请求,接收到服务端响应后,选取一张本地证书并上传服务端。 b) 服务端验证接收到的客户端证书,若验证通过则继续。 c) 服务端产生一串随机数并记录下来。 d) 服务端建立一个上述客户端证书与随机数的对应关系。 e) 服务端用服务端私钥对这串随机数进行签名。 f) 服务端将服务端证书、随机数、服务端随机数签名一起用客户端证书加密并传给客户端。 g) 客户端用客户端私钥解密收到的数据,得到服务端证书、随机数、服务端随机数签名。
  • 17. h) 客户端验证得到的服务端证书,若验证通过则继续。 i) 客户端验证得到的服务端随机数签名,若验证通过则继续。 j) 客户端用客户端私钥对得到的随机数进行签名。 k) 客户端将客户端证书、随机数、客户端随机数签名一起用服务端证书加密并传给服务端。 l) 服务端用服务端私钥解密收到的数据,得到客户端证书、随机数、客户端随机数签名。 m) 服务端比对并验证得到的客户端证书,若比对和验证通过则继续。 n) 服务端比对得到的随机数并验证得到的客户端随机数签名,若比对和验证通过则继续。 o) 服务端取客户端证书中特定的项目或项目组合,与系统用户数据库中相应的项目比对。 p) 若比对通过则相应客户端的登陆请求,用户巨额可成功登陆,继续进行业务操作。
  • 18. Client CAPICOM JCE Server 1. 用户发起页面请求 request for page 客户端证书 2. 验证客户端证书 3. 产生一串随机数并记录下来 4. 将此随机数与客户端证书对应 5. 用服务端私钥对随机数签名 response for page 6. 用客户端证书加密发送数据 服务端证书 随机数 服务端随机数签名 7. 用客户端私钥解密接收数据 8. 验证服务端证书 9. 验证服务端随机数签名 10.用客户端私钥对随机数签名 request for access 11.用服务端证书加密发送数据 客户端证书 随机数 客户端随机数签名 12. 用服务端私钥解密接受数据 13. 验证客户端证书 14. 验证随机数 15. 验证客户端随机数签名 16. 验证客户端证书指定细目 response for access 17. 服务端响应登陆请求 业务应用交互 说明 [3-4]将接收到的客户端证书与服务端针对本次会话生成的随机数对应起来以备后续验证 [13-14]除验证客户端证书有效性外,还需比对其是否为先前接收到的证书,并比对随机数是否为先前生成的相应的随机数 [16]取客户端证书中特定的细目或细目的组合,如Subject,SubjectUID,IssuerUID等等,进行进一步的身份验证 图 5-12 [互通应用模型 – 系统登陆模型流程图] 注:也可将业务应用中所有用户的证书存放在服务端数据库中, Unique Identifier(UID) 由 或其他唯一标识指定,用户访问时只需要上送这个标识即可对应其用户的证书和帐户。