日常开发中几乎所有的程序猿(媛)们都知道HTTPS
是用来客户端和服务器进行的一种安全连接,可以有效的保证内容信息安全,防止被抓包,那怎么保证信息安全的呢?很多人又会说加密,不得不承认说的没错,是利用加密
方式进行的非明文
传输,但是最后的问题来了,这怎么进行加密解密的呢?真正了解原理的人就少了很多,下面的内容就是为了丰(用)
富(来)
你(装)
的(比)
知识面准备的!
什么是HTTPS
HTTPS可以理解为HTTPS = HTTP+SSL/TLS
,HTTPS的核心基础就是SSL,只要弄懂了SSL就知道HTTPS怎么工作的了。
加密算法
下面请允许我嘚(装)
瑟(比)
一下公元前400年,古希腊人就发明了置换密码;在第二次世界大战期间,德国军方启用了“恩尼格玛”密码机,所以密码学在社会发展中有着广泛的用途。嘚(装)瑟(比)结束。
加密算法基本上可以分为两种类型:
对称加密
什么是对称加密呢?简单的理解就是双方都共同拥有一个密钥,然后通过这个密钥进行加密和解密,这种加密方式优点就是速度快
,但是安全性不高
,不能说不高,只是没有非对称加密高。
举个栗子:
我们大家都看过谍战片吧,尤其是抗日战争时期的谍战片简直就是霸屏了,什么手撕鬼子,手榴弹炸飞机啊什么的各种洗脑!其中有些情节一定很熟悉,那就是情报!地下情报员和情报处之间进行情报交流的时候,往往都不是通过非明文传输信息,他们有一个共同的密钥就是一本书,什么三国演义啊,论语啊,葵花宝典啊,通过这本书(前提是这本书是一样的,盗版就废了)双方就能获得相同的信息,如果过程中被别人窃取了情报,如果不知道葵花宝典这本密钥的话,他是不会得到真正的信息。
这就是所谓的对称加密和解密,但是安全性不是很高,你想想,如果葵花宝典这本书泄漏给了小鬼子,小鬼子拿到咱们的情报,是不是后果不堪设想了!
非对称加密
非对称加密有两个重要的角色,公钥
和私钥
,一般遵循这样一个原则,公钥加密
,私钥解密
。
举个栗子:
A和B两家公司,需要交流重要信息(比如交易金额发起和交易结果通知)。A需要保证自己的发起金额准确,必须进行信息加密,B公司是实际金额的操作者(帮A公司代收代付),A使用B给的公钥加密数据,B使用自己的私钥解密执行金额交易。这样只有和B公司合作的并持有B公司发放的公钥才能发起交易。反之,A公司也只识别给了公钥的B公司加密的数据。这样就是最基本的非对称加密的用法。但是有一个新的问题是,假如同样持有B公司公钥的C公司模拟或从中修改了A公司发起数据并加密传给了B,B不知道是C伪造的执行了操作就会给A带来经济损失。所以新的问题出现了:身份认证和信息完整性必须验证!
CA证书
为了解决上边说到防止被劫持问题,必须进行必要的身份认证和信息完整性认证,这就说到了CA证书,CA证书其实就是数字证书,是有权威机构颁发的,浏览器和Android手机都内置了几百个公认的证书,有些项目需要自己申请自签名的证书,用于项目使用,但是不管什么证书,都需要CA权威机构颁发的,里边包括以下内容:
- 证书的发布机构
- 证书的有效期
- 证书的所有者
- 证书的数字签名和签名的Hash算法
- 证书的公钥
- ......
先说下客户端校验CA证书的方法
校验方法
- 首先客户端读取证书中的证书所有者、有效期等信息进行一一校验
- 客户端开始查找操作系统中已内置的受信任的证书发布机构CA,与服务器发来的证书中的颁发者CA比对,用于校验证书是否为合法机构颁发
- 如果找不到,客户端就会报错,说明服务器发来的证书是不可信任的。
- 如果找到,那么客户端就会从操作系统中取出 颁发者CA 的公钥,然后对服务器发来的证书里面的签名进行解密得到
hash-a
。 - 客户端使用相同的hash算法计算出服务器发来的证书的hash值
hash-b
,将这个计算的hash值与证书中签名做对比。 - 对比结果一致,则证明服务器发来的证书合法,没有被冒充
知道以上内容,我们就来详细的看一下解决身份认证和信息完整性验证的具体过程,也称为HTTPS的中SSL握手建立过程,如下图所示:
image
- 比如我们用浏览器打开一个网页 https://www.baidu.com ,这时,浏览器就是客户端 A ,百度的服务器就是服务器 B 了。这时候客户端 A 会生成一个
随机数(1)
,把随机数(1)
、自己支持的SSL 版本号
以及加密算法
等这些信息告诉服务器 B 。 - 服务器 B 知道这些信息后,然后确认一下双方的加密算法,然后服务端也生成一个
随机数(2)
,并将随机数(2)
和CA颁发给自己的证书
一同返回给客户端 A 。 - 客户端 A 得到 CA 证书后,会去校验该 CA 证书的
有效性
,校验方法在上边说过了。校验通过后,客户端生成一个随机数(3)
,然后用证书中的公钥加密随机数(3)
并传输给服务端 B 。 - 服务端 B 得到加密后的随机数3,然后利用
私钥
进行解密,得到真正的随机数(3)
. - 最后,客户端 A 和服务端 B 都有随机数(1)、随机数(2)、随机数(3),然后双方利用相同规则把这三个随机数生成一个
对话密钥
。之后传输内容就是利用对话密钥来进行加解密了。这时就是利用了对称加密
,一般用的都是AES
算法。 - 服务端 B 把内容通过该对话密钥进行对称加密,将信息和密钥通过某种算法混合在一起,这样除非知道密钥,不然无法获取内容,而正好客户端和服务端都知道这个密钥,所以只要加密算法够彪悍,密钥够复杂,数据就够安全。
- 传输加密后的信息 这部分信息就是服务端 B 用密钥加密后的信息,可以在客户端 A 用随机值解密还原。
- 客户端解密信息 客户端A用之前生产的密钥解密服务端传过来的信息,于是获取了解密后的内容。整个过程第三方即使监听到了数据,也束手无策。
到此,SSL 握手过程就讲完了。可能上面的流程太过于复杂,我们简单地来讲:
- 客户端和服务端建立 SSL 握手,客户端通过 CA 证书来确认服务端的身份;
- 互相传递三个随机数,之后通过这随机数来生成一个密钥;
- 互相确认密钥,然后握手结束;
- 数据通讯开始,都使用同一个对话密钥来加解密;
结束语
综上所述,相比 HTTP 协议,HTTPS 协议增加了很多握手
、加密解密
等流程,虽然过程很复杂,但其可以保证数据传输的安全。所以在这个互联网膨胀的时代,其中隐藏着各种看不见的危机,为了保证数据的安全,维护网络稳定,建议大家多多推广HTTPS。
本人菜鸟,结合先人创作以上有什么不对的地方欢迎指出!
网友评论