数字签名 数字证书
数字签名数字证书...
数字签名主要有以下几个步骤:
第一、发方首先有一个公钥/私钥对,它将要签名的报文作为一个单向散列函数的输入,产生一个定长的散列码,一般称为消息摘要。
第二、使用发放的私钥对散列码进行加密生成签名。将报文和签名一同发出去。
第三、收方用和发放一样的散列函数对报文运算生成一个散列码,同时用发放的公钥对签名进行解密。
第四、如果收方计算得到的散列码和解密的签名一致,那么说明的确是发方对报文进行了签名而且报文在途中没有被篡改。
其具体过程如图1所示:
数字签名简介
如前所述,数字签名主要分为两个步骤:产生消息摘要和数字签名。
使用单向散列函数的目的就是可以让任意长度的消息压缩成为某一固定长度的消息摘要。单向散列函数又称之为单向Hash函数,它并不是加密函数,其基本模型为:
h=F(M)
其中M是输入的消息正文,可以为任意长度;F为单向散列算法/函数;h为生产的消息摘要,拥有固定的长度,它和M的长度无关。一个好的单向散列算法F应该有以下5个特性:1、能处理任意长度的M(至少在实际应用中能碰到的任何长度);2、生成的消息摘要h,要有不可预见性,h看起来和M没有任何关系;3、给定M应该能很容易算出h;4、给定h不能计算出M,甚至不能得到关于M的任何信息;5、给定任何一个M1,要想找到另一个M2,且M2不等于M1,要使F(M1)和F(M2)的结果一样很难,在计算上要几乎不可行.
目前在密码学上已经设计出了大量的单向散列算法,比如RabinHash方案、MerkleHash方案,NHash算法,MD2算法,MD4算法,MD5算法和SHA等。实际中常用的单向散列算法有消息摘要算法MD5(Message Digest5)和安全散列算法SHA(Security Hash Algorithm).
如上所述,进行数字签名至少应该进行以下2步:
(1)发方用单向散列函数F对消息正文M进行计算,产生散列码h
(2)发方用其用其私匙对散列码进行h加密,把加密后的散列码和消息正文一起发送出来。
验证数字签名至少需要以下2个步骤:
(1)接方用单向散列函数F对接受到消息正文M进行计算,产生散列码h2
(2)接方用发方的公钥对接收到散列码进行解密,还原得到散列码h,比较散列码h和散列码h是否一致。
如果一致就说明发方的确对该消息进行了签名,且消息在途中没有被窜改。
数字证书
实际上,好多的公钥都是通过数字证书进行发布的,数字证书类似一个人的身份证一样,由对应的官方的颁发结构颁发的,类似一个人的身份证有姓名,身份证ID,有效期,颁发机构-一般是某某派出所等,数字证书也有类似的形式。
基本的数字证书包括了一些常见的信息:
1, 对象的名称(人,服务器,组织等)
2, 过期时间
3, 对象的公钥
4, 证书发布者(由谁为证书担保)
5, 来自证书发布者的数字签名。
…
需要注意的是,任何人都可以创建一个证书,但不是所有人都能够获得受人尊敬的签发权从而为证书信息提供担保,并用其私人密钥签发证书。
不幸的是,数字证书没有单一的全球标准,但现在使用的大多数证书是以一种标准格式– X.509 v3,来存储它们的信息。
x.509证书格式:
字段
描述
版本号
这个证书的X.509证书版本号,现在通常是版本3
序列号
证书颁发机构CA生成的唯一整数,CA生成的每个证书都要有一个唯一的系列号,类似身份证号码
签名算法ID
签名使用是算法,如用RSA加密的MD2摘要
证书颁发者
以X.500格式说明的CA的组织名称
有效期
证书的有效期,由一个起始日期和一个结束日期来表示
对象名称
证书中描述的实体,比如一个人或者一个组织,对象名称以x.500格式表示
对象的公开密钥信息
证书对象的公钥,公钥使用的算法,以及所有附加的参数
发布者唯一的ID(可选)
可选的证书发布者唯一ID,这样可以重用相同的发布者名称了
对象唯一的ID(可选)
可选的证书对象唯一ID,这样就可以重用相同的对象名称了
扩展
一些扩展信息
证书的颁发机构签名
CA用指定的签名算法对上述所有字段的数字签名
x.509证书有很多种,如服务器端证书,个人证书等。
浏览器中的证书:
注意:每个证书均有对应于证书公钥的私钥,私钥不能被导出,访问一般需要密码等,实际上,在CA给某个对象颁发一个证书的时候,同时会分配一个对应证书中公钥的私钥。
浏览器会默认存储一些受信任的根证书颁发机构的证书,从图中可以看,这些证书都是颁发者颁发给自己的。
关注 闫吉峰
微信扫一扫关注公众号