zoukankan      html  css  js  c++  java
  • 数字签名与数字证书技术简单介绍(三)

      数字证书

    前两篇文章,分别介绍了非对称加密算法和数字签名技术:

    http://blog.csdn.net/u014419512/article/details/26290821

    http://blog.csdn.net/u014419512/article/details/26408029


    基于非对称密钥算法,Bob生成了一对公私钥。Bob将公钥公布在公开的密钥库中。而Alice在向Bob发送加密文件或者验证Bob签名的文件时,均要从公钥库取到Bob的公钥。我们已经知道,一般来说公钥就是一段固定长度的字符串,并没有特定的含义。

    为了让Alice可以方便的辨别公钥,我们可以考虑对给公钥附加一些信息,比如该公钥使用的算法,该公钥的全部者(主题),该公钥的有效期等一系列属性。这种数据结构我们称作PKCS10数据包



    公钥的主题我们採用唯一标示符(或称DN-distinguished name),以尽量唯一的标示公钥全部者。下面是基于抽象语法表示法所定义的PKCS10数据结构:

    CertificationRequestInfo ::= SEQUENCE {  
    		version          INTEGER { v1(0) } (v1,...), 
    		subject          Name,  
    		subjectPKInfo  SubjectPublicKeyInfo{{ PKInfoAlgorithms }},  
    		attributes       [0] Attributes{{ CRIAttributes }}  
    		}  
    	SubjectPublicKeyInfo { ALGORITHM : IOSet} ::= SEQUENCE {  
    		algorithm     AlgorithmIdentifier {{IOSet}}, 
    		subjectPublicKey  BIT STRING  
    		}  
    
    	PKInfoAlgorithms ALGORITHM ::= {   
    		...  -- add any locally defined algorithms here -- }  
    	
    	Attributes { ATTRIBUTE:IOSet } ::= SET OF Attribute{{ IOSet }}   
    	
    	CRIAttributes  ATTRIBUTE  ::= {  
    		... -- add any locally defined attributes here -- }  
    
    	Attribute { ATTRIBUTE:IOSet } ::= SEQUENCE {  
    		type    ATTRIBUTE.&id({IOSet}),  
    		values  SET SIZE(1..MAX) OF ATTRIBUTE.&Type({IOSet}{@type}) 
    	} 

    我们已经有了PKCS10数据包,除了公钥信息外,还有公钥的持有者,公钥的版本等信息。然而这种数据结构事实上并没有不论什么权威性。比如有一天一个叫做Richard的人想冒充Bob,也生成一对公私钥,而且使用了同样的公钥主题封装为P10数据结构。Alice事实上并没有办法分辨哪个是真实Bob的公钥。

    为了解决问题,就须要一个权威的第三方机构,对P10结构的数据进行认证。就如同对P10文件盖上一个权威的章,防止仿照。这种权威机构,我们称作CA(Certificate Authority)数字证书认证中心。而CA怎样为P10数据盖章呢?很easy,就是我们前文已经提到的数字签名技术:


    ① 如上图所看到的,CA机构事实上也持有一张私钥。一般来说,CA会对这份私钥进行特别的保护,严禁泄漏和盗用。

    ② Bob将自己的公钥附加上一系列信息后,形成了P10数据包(请求包),并发送给CA

    ③ CA机构通过其它一些手段,比如查看Bob的身份信息等方式,认可了Bob的身份。于是使用自己的私钥对P10请求进行签名。(也可能会先对数据进行一些简单改动,如改动有效期或主题等)

    ④ 这种签名结果,我们就称作数字证书。

     

    数字证书相同遵循一个格式标准,我们称作X509标准,我们一般提到的X509证书就是如此。下面是X509的格式:

    [Certificate ::= SEQUENCE {
    	tbsCertificate TBSCertificate,
    	signatureAlgorithm AlgorithmIdentifier,
    	signature BIT STRING
    }
    
    TBSCertificate ::= SEQUENCE {
    	version [0] EXPLICIT Version DEFAULT v1,
    	serialNumber CertificateSerialNumber,
    	signature AlgorithmIdentifier,
    	issuer Name,
    	validity Validity,
    	subject Name,
    	subjectPublicKeyInfo SubjectPublicKeyInfo,
    	issuerUniqueID [1] IMPLICIT UniqueIdentifier OPTIONAL,
    	-- If present, version must be v2or v3
    	subjectUniqueID [2] IMPLICIT UniqueIdentifier OPTIONAL,
    	-- If present, version must be v2or v3
    	extensions [3] EXPLICIT Extensions OPTIONAL
    	-- If present, version must be v3
    	}
    Version ::= INTEGER {
    	v1(0), v2(1), v3(2)
    }
    
    CertificateSerialNumber ::= INTEGER
    	Validity ::= SEQUENCE {
    	notBefore CertificateValidityDate,
    	notAfter CertificateValidityDate
    }
    
    CertificateValidityDate ::= CHOICE {
    	utcTime UTCTime,
    	generalTime GeneralizedTime
    }
    
    UniqueIdentifier ::= BIT STRING
    	SubjectPublicKeyInfo ::= SEQUENCE {
    	algorithm AlgorithmIdentifier,
    	subjectPublicKey BIT STRING
    }
    
    Extensions ::= SEQUENCE OF Extension
    Extension ::= SEQUENCE {
    	extnID OBJECT IDENTIFIER,
    	critical BOOLEAN DEFAULT FALSE,
    	extnValue OCTET STRING
    }

    基于数字证书,我们能够再来看看Bob怎样给Alice发送一份不可否认、不可篡改的文件:


    第一步:Bob除了对文件进行签名操作外,同一时候附加了自己的数字证书。一同发给Alice



    第二步:Alice首先使用CA的公钥,对证书进行验证。假设验证成功,提取证书中的公钥,对Bob发来的文件进行验签。假设验证成功,则证明文件的不可否认和不可篡改。


    能够看到,基于数字证书后,Alice不在须要一个公钥库维护Bob(或其它人)的公钥证书,仅仅要持有CA的公钥就可以。数字证书在电子商务,电子认证等方面使用很广泛,就如同计算机世界的身份证,能够证明企业、个人、站点等实体的身份。同一时候基于数字证书,加密算法的技术也能够支持一些安全交互协议(如SSL)。下一篇文章,将为大家介绍SSL协议的原理。

  • 相关阅读:
    sql中压缩日志文件和ntextl转化为varchar的处理
    一个生成验证字符或数字的增强类(downmoon)(基于.net1.1)及调用示例
    web程序中获取应用程序系统变量的方法( For.net 1.1)
    ASP.NET 中的正则表达式MSDN(2)
    让sourceSafe每天自动备份及修复(适用于vss6.0和vss2005)
    用SQL语句修改字段的默认值
    关于.net2.0中Webconfig中连接串的加密
    软件工厂简介自MSDN
    获取SqlServer 2000中字段的备注信息
    使用.NET 向浏览器写入二进制文件
  • 原文地址:https://www.cnblogs.com/hrhguanli/p/3844229.html
Copyright © 2011-2022 走看看