https方面知识的理解

eg756 9年前

开篇

相信程序猿们都有所了解https,就我个人而言一个月前我只知道https连接是安全的,加密了的,但是具体怎么加密的,证书是怎么认证的,为什么安全,我说不出来一二三。如果你跟我有一样的情况,那我们一起来探明它吧。

https连接过程

我们先来个简明概要的:

超简版

  1. 客户端(浏览器) -> 服务器(网站): hello服务器 , 加密算法a,b,c,hash算法d,e,f,ssl版本x.x
  2. 服务器(网站) -> 客户端(浏览器):选择a加密算法 和e hahs算法,我的证书
  3. 客户端 (浏览器)-> 服务器(网站):hash值hash1,消息message1,加密了的随机数secret1
  4. 服务器(网站) ->客户端(浏览器):hash值 hash2 消息message2
  5. 后续开始加密通信

看完之后,是不是啥也没懂,O(∩_∩)O哈哈~,不要急,接着看下更详细的,记得要跟上面的对比下:

详细版

  1. 客户端向服务器say hello

    客户端(浏览器) -> 服务器(网站):hello服务器,我支持a,b,c 加密算法和 d,e,f hash算法,支持ssl版本是 x.x

  2. 服务器收到后,选择一组算法连带着证明自己的证书一并发送给客户端

    服务器(网站) -> 客户端(浏览器):我选择 a 加密算法 和 e hash算法 还有我的证书(表明公钥,有效期,拥有者,签名者 bla,bla)

  3. 客户端验证证书的合法性,生成一个随机数 123,将要发送的消息(hello)使用e hash算法,算好hash值 hash1 ,使用加密算法a ,用随机数加密要发送的消息(hello)得消息message1,用证书中的公钥加密随机数得 secret1

    客户端 (浏览器)-> 服务器(网站): hash值hash1,消息message1,加密了的随机数secret1

  4. 服务器用自己的私钥将secret1解密得随机数123,再使用随机数123通过加密算法a 解密消息message1得到hello,再通过算法e 算出消息hello的hash值 hash1,与传过来的hash值比对一致,正确。 一致之后,服务器自己选择一条消息(hello,too),使用hash算法e 算出hash值 hash2,使用随机数123加密消息(hello,too)得消息message2

    服务器(网站) ->客户端(浏览器):hash值 hash2 消息message2

  5. 验证成功

    后续开始加密通信,使用的是随机数123和加密算法 a 来加密要通信的信息,并用hash算法 e 来计算要通信的信息

好了,大致通信就是这个过程,当然上述还有很多地方需要解释,只是想给大家一个宏观上的流程,之后我会一一列举解释的。

  • 保护世界的算法-RSA算法
  • 对称加密和hash算法
  • 伪随机数,猜不透的伪随机
  • 信任是根本-证书,CA认证

保护世界的算法-RSA算法

这个标题起的太霸气了,但对RSA来说真的是当之无愧。因为https的安全就是基于RSA算法不会被攻破的基础上的,如果以后RSA算法可以被攻 破,那计算机的世界就没有安全可言了。算法原理我自己还没弄的十分懂,所以我就不班门弄斧了,我能理解的就是,RSA算法是一种非对称算法,什么又是非对称算法呢?就是加密和解密不用同一个密钥,分公钥和私钥,你用公钥加密只能用私钥才能解密,反之同理私钥加密只能用公钥解密。如果想了解原理,附上,阮一峰的网络日志-《RSA算法原理(一)》,话说解释的已经很好了,但是我还是没太懂o(╯□╰)o,数学真是捉急啊。

对称加密和hash算法

对称加密,相比于非对称加密就是,加密解密都需要同一个密钥,目前主流的有:DES、3DES、AES 等等。 hash算法,其实这个也好解释,像我们编程语言中都会有hash算法,最常用的就是hashcode方法,其实hash的本质就是摘取原信息的一部分来 运算得到一个可以代表原信息的token串,当然hash算法都存在所谓的碰撞,hash的作用就是可以快速的来验证信息的相等或不等(虽然有一定的碰撞 几率,但是在很多情况下可以忽略),比较有名的hash算法:MD4、MD5、SHA-1等等。

https中使用加密算法加密通信过程中信息,使用的密钥是浏览器和服务器都拥有的随机数,建立一次连接用一个随机数,而hash的用处就是来保证信息在这个过程中完整性以及不被替换。

伪随机数,猜不透的伪随机

java中的random相信大家都用过,那就是一种伪随机数。浏览器生成的伪随机数一定要达到近似的随机,否则被猜到每次生成的数那这https连接也就没有意义了。 这里的随机数,在握手之后就用来浏览器和服务器的通信的密钥了,所以重要性可想而知。

信任是根本-证书,CA认证

最后,就是CA证书啦,这个我要多费点唾沫O(∩_∩)O~~。 我们先回顾上述的https建立连接的过程,其中服务器端将一个证书发送给客户端,证书中包含公钥和所属的单位以及有效期。只有客户端信任了这个证书,我们才能进行下面的步骤。 好关键的来了,首先这个证书是谁颁发的,我们怎么判断证书为合法的呢?

证书是CA颁发的,也就是认证机构,他们去负责验证网站的合法性以及给网站生成证书。CA也就是这个过程中的第三方,说到底我们还是需要无条件的去信任这个第三方,如果没有这个信任也就无从来判断信息的合法性了。

验证合法性,浏览器中都会内置CA机构的根证书,如图:  https方面知识的理解

这些都是浏览器信任的根证书,服务器发过来的证书都是以根证书为基础的后续枝叶。这个还要说一下,通过根来验证后续的证书合法性的具体做法,也就是利用了RSA非对称加密,CA在颁发证书的时候用自己的私钥加密一条信息放在颁发的证书里,只有对应CA的公钥才能解密。 我们来看看百度的https的证书

 https方面知识的理解

那么问题又来了(好问的小孩),如果浏览器没有内置某个认证机构的根证书呢?

如图:  https方面知识的理解  https方面知识的理解

这就是咱们大名鼎鼎的12306,哈哈,让我笑五分钟,收。浏览器内置的证书都是对机构高度信任的,像咱这个人家都不认的,这也是为了我们安全,如果我们手动把证书安装到浏览器中,以后12306随便签名一个证书,我们都会......。留下想象空间。

关键点

个人认为整个https通信中,有几处至关重要的点,也是我们平时自己网站需要注意的。

  1. 私钥:简直是忒重要了,要是让别人那到这个,那不就是想干啥干啥了,要是我一定锁到小金库中。整个https握手的过程中,私钥只使用了一 次,之后就是用随机数当做密钥通信了。这样就算让你获取到了密钥,也只局限这一次,并且保证了私钥没有在网络中传输,大大提高了安全性。

  2. 随机数的生成方式: 要是把浏览器的随机数生成方式,那任你什么算法,通通都没用了,所以随机数生成的方式是一个很大的课题啊。

  3. 证书,第三方,整个安全体系我们还是要取信任第三方,生活中也是这样,我们整个社会的经济也是建立在信用基础上的。但是我用程序猿的思维想象,如果我取得一个著名CA的控制权,我岂不是取得了互联网上大多数电脑的控制权?想想也挺爽的哈。

最后发言

本想把本文写的简单点,但是能力有限,又写成了一篇流水文了,抱歉抱歉。笔者花了大概三周的时间看了这方面的文章,感觉也学到了不少东西,就把自己所接受到的知识,转成直白点的话,叙述了一遍。文中如果有什么理解不对的地方,还望指出,帮助学习。

参考文章:

《数字证书原理》(推荐) 《How does HTTPS actually work?》 阮一峰的网络日志-《图解SSL/TLS协议》 阮一峰的网络日志-《SSL/TLS协议运行机制的概述》 阮一峰的网络日志-《RSA算法原理》 伯乐在线-《HTTPS是如何保证连接安全:每位Web开发者都应知道的》 伯乐在线-《HTTPS连接的前几毫秒发生了什么》 coodoing-《HTTPS工作原理和TCP握手机制》 果壳-《HTTPS那些事(一)HTTPS原理》 果壳-《HTTPS那些事(二)SSL证书》

来自:http://my.oschina.net/OpenSourceBO/blog/488374