实现HTTPS系列第三弹之【数字签名,数字证书,CA认证等概念理解】

博文说明【前言】:

    本文将通过个人口吻介绍数字签名,数字证书,CA认证等相关知识,在目前时间点【2017年5月11号】下,所掌握的技术水平有限,可能会存在不少知识理解不够深入或全面,望大家指出问题共同交流,在后续工作及学习中如发现本文内容与实际情况有所偏差,将会完善该博文内容。

 

1、第一弹:实现HTTPS系列第一弹之【http,https,www,web等概念简介】

博文链接:http://watchmen.blog.51cto.com/6091957/1922919

2、第二弹:实现HTTPS系列第二弹之【非对称加密,公钥私钥,数字签名,OpenSSL及HTTPS等概念简介】

博文链接:http://watchmen.blog.51cto.com/6091957/1923426


本文参考文献引用链接:

1、https://www.zhihu.com/question/25912483

2、https://blog.jorisvisscher.com/2015/07/22/create-a-simple-https-server-with-openssl-s_server/

3、https://zh.m.wikipedia.org/zh-hans/%E6%95%B0%E5%AD%97%E8%AF%81%E4%B9%A6%E8%AE%A4%E8%AF%81%E6%9C%BA%E6%9E%84

4、http://blog.csdn.net/until_v/article/details/40889565【推荐必看】

5、http://www.youdzone.com/signature.html【经典,推荐必看】

6、http://blog.csdn.net/sszgg2006/article/details/8199175【推荐必看】

7、http://www.tuicool.com/articles/7buueeQ【经典,推荐必看】


正文:


    我们知道常用的RSA(非对称加密算法中常用的一种,还有其他算法)公钥与私钥主要用于不对称加密/解密,另外一种用法我们一般称之为数字签名(Digital Signature)与认证(Authentication),也即在这里私钥加密=数字签名,解密=用公钥认证,接下来就将展现签名与认证相关知识


注:本文中的加密算法默认指的就是RSA,摘要算法主要有 MD5 和 SHA1 

所谓信息摘要,其实就是某种 HASH 算法。将信息明文转化为固定长度的字符,它具有如下特点:

① 无论输入的消息有多长,计算出来的消息摘要的长度总是固定的 ;

② 用相同的 摘要算法对相同的消息求两次摘要,其结果必然相同;

③ 一般地,只要输入的消息不同,对其进行摘要以后产生的摘要消息也 几乎不可能相同;

④ 消息摘要函数是单向函数,即只能进行正向的信息摘要,而无法从摘要中恢复出任何的消息;

⑤ 好的摘要算法,没有人能从中找到 “ 碰撞 ” ,虽然 “ 碰撞 ” 是肯定存在的。即对于给定的一个摘要,不可能找到一条信息使其摘要正好是给定的。或者说,无法找到两条消息,是它们的摘要相同。


    问题1::什么是认证?

    认证是安全通信的前提,如果认证出问题,A不是和A想要聊天的人B在聊天,而是和一个C(假冒B)在聊天,则接下来所有的安全措施都是白搭。以目前常用的数字证书(Digital Certificate)认证为例。


    CA(数字证书认证机构,Certificate Authority,CA是缩写),也可以称之为电子商务认证中心或者电子商务认证授权机构。CA是负责发放和管理数字证书的权威机构,并作为电子商务交易中受信任的第三方,承担公钥体系中公钥的合法性检验的责任。【有点抽象,我们接着往下看】

    CA的主要工作:CA中心为每个使用公开密钥的用户发放一个数字证书,数字证书的作用是证明证书中列出的用户合法拥有证书中列出的公开密钥。数字证书中的CA数字签名(用CA的私钥对用户申请摘要信息进行加密)使得攻击者不能伪造和篡改证书。

    总结1:CA主要功能是发放、认证、管理数字证书。


    CA本身也会有一个证书,因为为了让网络用户信任CA,任何人都可以使用这个证书验证CA签发的证书(CA的数字签名),默认这个证书在系统预装的时候就会携带。

    数字证书申请:用户想得到一份属于自己的证书,需要向CA提出申请(申请资料包括用户的公钥及用户信息),在CA判别申请者的身份后,将该公钥与申请者的身份信息绑定在一起,对这2个信息做一个hash处理,得出一个hash值,CA用私钥对这个hash进行加密,也就是CA的数字签名,签名之后,便会形成证书(证书内容是公钥和申请者身份信息,以及CA的数字签名,签名加密的内容是这2个信息的摘要hash值)。

总结2:数字证书=公钥(CA分配)+申请者身份信息+CA的数字签名



原创案例-实战分析1-数字签名:


小丽已经事先拿到老王的公钥(公钥对外公布),老王要给小丽写信,为了安全,决定使用数字签名的方式,过程如下:

注意1:小丽给老王写信,使用老王的公钥加密数据,再将加密后的信发送老王即可,因为私钥只有老王有,因此老王收信后,用私钥解密,就看到了信中内容。这里要强调的是,只要老王的私钥不泄密,这封信就是安全的,即使落在别人手里,也无法解密。因此在这里我们说的是老王回信的情况。

1、老王把信写好

2、老王得出这封信的摘要信息:信的摘要digest(通过对信做hash运算得出摘要)

3、老王对信的摘要digest,使用私钥进行加密得出数字签名(signature)

4、老王将:信+数字签名  发送给小丽

5、小丽收到老王发送过来的 信+数字签名

6、小丽对信使用hash得出摘要digest-2

7、小丽对数字签名 进行解密得出摘要digest-3【在这里其实就是digest】

8、小丽对比digest-2 和digest-3,如果相同,则表示这封信确实是由老王所发。

这8个步骤解释了什么是数字签名

案例总结:数字签名=发送者用自己的私钥对所要发送的信息的摘要信息进行加密,这个得出的值我们可以称之为数字签名


原创案例-实战分析2-数字证书:

突然有一天,老张潜入了小丽的电脑,把老王的公钥换成老张的公钥,时间一久,小丽觉得不对劲,发现老王的信不像是老王写的。于是就告诉老王为公钥做一个认证

于是老王找到CA认证中心(Certificate Authority),申请为公钥做认证。

CA拿到老王的公钥以及申请信息之后,使用自己的私钥对这2个信息的摘要信息进行加密,生成数字证书(Digital Certificate)【其实在这里,CA做的是数字签名操作】

案例总结:数字证书=老王的公钥+老王的申请信息+CA的数字签名

老王拿到这个数字证书之后,以后再给小丽写信的时候,就是下面这种

1、老王把信写好

2、老王得出这封信的摘要信息:信的摘要digest(通过对信做hash运算得出摘要)

3、老王对信的摘要digest,使用私钥进行加密得出数字签名(signature)

4、老王将:信+数字签名+数字证书  发送给小丽

5、小丽收到老王发送过来的 信+数字签名 +数字证书

6、小丽对信使用hash得出摘要digest-2

7、小丽对数字签名signature 进行解密得出摘要digest-3【在这里其实就是digest】

8、小丽对比digest-2 和digest-3,如果相同,则表示这封信确实是由老王所发。

那么这个老王是不是真的老王而不是老张呢?于是就有下面的额外几个步骤

9、小丽用CA的公钥(CA的公钥已事先对外公布)对数字证书中的CA的数字签名进行解密,得出值A,

然后对证书中的老王的公钥和老王的申请信息做一个摘要再做一个hash,得出值A2,如果A2=A,则证明这个证书的公钥是老王的。


原创案例-实战分析3-HTTPS访问:


我们来用一个国人最常见的HTTPS访问做案例:


百度公司已经事先找CA认证过,因此拥有数字证书(内容是公钥+申请信息+CA的数字签名)


我们在客户端输入https://www.baidu.com,这就意味着本机的客户端向这个域名对应的服务器发送加密的访问web请求,请求的东西是一个html页面。

web服务器接受到请求之后,将页面+这个页面的数字签名+百度的数字证书返回给客户端


客户端收到之后,使用CA的公钥(本机自带的CA数字证书,一般是系统预装含有,或者是后期安装)验证百度的数字证书,然后得出:百度的公钥和申请信息的摘要信息的hash值,然后再和CA的数字签名内容进行计算比对。


一般来说,这个申请信息中就包含有这些网址域名信息,如果数字证书记载的网址,与你正在浏览的网址不一致,就说明这张证书可能被冒用,浏览器发出警告,也就是说如果这个www.baidu.com域名不在这个申请信息里面,那么就会有下面这种提示:

实现HTTPS系列第三弹之【数字签名,数字证书,CA认证等概念理解】

如果这张数字证书不是由受信任的机构颁发的,也就是不被信任的CA颁发的,浏览器会发出另外一种警告。

实现HTTPS系列第三弹之【数字签名,数字证书,CA认证等概念理解】


案例总结:

如果证明数字证书是可靠的,那么就意味着证书中的baidu的服务器的公钥是可靠的,那么接下来的数据传输,客户端将会使用这个公钥来对数据进行加密。通过这个公钥就可以加密我们在实际通信中使用的对称密钥(非对称算法时间成本太大,因此使用非对称算法传递对称密钥,之后再使用对称密钥)


注意2:我们在实际数据传输的时候,使用的是对称加密,并不是非对称加密,主要原因是因为非对称加密的时间成本太大,具体的区别本文暂时没有记录,计划后期编写博文记录。



结尾:


    下一篇:实现HTTPS系列第四弹之【TLS ,SSL,PKI等知识讲解】

    博文地址:http://watchmen.blog.51cto.com/6091957/1927937


     感谢阅读,祝有收获的一天,谢谢!




      本文转自1清风揽月1  51CTO博客,原文链接:http://blog.51cto.com/watchmen/1924747,如需转载请自行联系原作者






上一篇:ping 命令----根据TTL判断对方是什么操作系统


下一篇:Silverlight实例教程 – Datagrid,Dataform数据验证和ValidationSummary