Android开发经验谈Android开发Android开发

和HTTPS握个手

2018-05-22  本文已影响212人  大公爵

“姑娘们,起来吃毓婷啦!”
520刚过去,5月21号早上这句话就突然火了,像我这种单纯的小宝宝根本不知道是什么意思。


正经一点

好吧,今天要讲的是HTTPS,很多人对HTTPS的概念一直是模模糊糊的,知道一些概念,但是真要详细说又说不出多少东西来。(PS:这里的很多人指的就是我自己)所以这篇文章就来解析下HTTPS到底是个什么东东。

HTTPS

HTTPS并不是和HTTP对立的一种新的传输协议,而是升级版的HTTP,这里的升级就体现在S。
HTTPS协议 = HTTP协议 + SSL/TLS协议,在HTTPS数据传输的过程中,需要用SSL/TLS对数据进行加密和解密,需要用HTTP对加密后的数据进行传输,由此可以看出HTTPS是由HTTP和SSL/TLS一起合作完成的。

SSL的全称是Secure Sockets Layer,即安全套接层协议,是为网络通信提供安全及数据完整性的一种安全协议。SSL协议在1994年被Netscape发明,后来各个浏览器均支持SSL,其最新的版本是3.0

TLS的全称是Transport Layer Security,即安全传输层协议,最新版本的TLS(Transport Layer Security,传输层安全协议)是IETF(Internet Engineering Task Force,Internet工程任务组)制定的一种新的协议,它建立在SSL 3.0协议规范之上,是SSL 3.0的后续版本。在TLS与SSL3.0之间存在着显著的差别,主要是它们所支持的加密算法不同,所以TLS与SSL3.0不能互操作。虽然TLS与SSL3.0在加密算法上不同,但是在我们理解HTTPS的过程中,我们可以把SSL和TLS看做是同一个协议。

HTTPS为了兼顾安全与效率,同时使用了对称加密和非对称加密。数据是被对称加密传输的,对称加密过程需要客户端的一个密钥,为了确保能把该密钥安全传输到服务器端,采用非对称加密对该密钥进行加密传输,总的来说,对数据进行对称加密,对称加密所要使用的密钥通过非对称加密传输。

密码学

说到这就不得不先讲一下密码学的基础概念

1、密码

密码学中的“密码”术语与网站登录时用的密码(password)是不一样的概念,password 翻译过来其实是“口令”,它是用于认证用途的一组文本字符串。
而密码学中的密码(cipher)是一套算法(algorithm),这套算法用于对消息进行加密和解密,从明文到密文的过程称之为加密,密文反过来生成明文称之为解密,加密算法与解密算法合在一起称为密码算法。

2、密钥

密钥(key)是在使用密码算法过程中输入的一段参数。同一个明文在相同的密码算法和不同的密钥计算下会产生不同的密文。很多知名的密码算法都是公开的,密钥才是决定密文是否安全的重要参数,通常密钥越长,破解的难度越大,比如一个8位的密钥最多有256种情况,使用穷举法,能非常轻易的破解。根据密钥的使用方法,密码可分为对称加密和公钥加密。

3、对称加密

对称密钥(Symmetric-key algorithm)又称为共享密钥加密,加密和解密使用相同的密钥。常见的对称加密算法有DES、3DES、AES、RC5、RC6。对称密钥的优点是计算速度快,但是它有缺点,接收者需要发送者告知密钥才能解密,因此密钥如何安全的发送给接收者成为了一个问题。

A 给 B 发送数据时,把数据用对称加密后发送给 B,发送过程中由于对数据进行了加密,因此即使有人窃取了数据也没法破解,因为它不知道密钥是什么。但是同样的问题是 B 收到数据后也一筹莫展,因为它也不知道密钥是什么,那么 A 是不是可以把数据和密钥一同发给 B 呢。当然不行,一旦把密钥和密钥一起发送的话,那就跟发送明文没什么区别了,因为一旦有人把密钥和数据同时获取了,密文就破解了。所以对称加密的密钥配是个问题。如何解决呢,公钥加密是一个办法。

4、非对称加密

公开密钥加密(public-key cryptography)简称公钥加密,这套密码算法包含配对的密钥对,分为加密密钥和解密密钥。发送者用加密密钥进行加密,接收者用解密密钥进行解密。加密密钥是公开的,任何人都可以获取,因此加密密钥又称为公钥(public key),解密密钥不能公开,只能自己使用,因此它又称为私钥(private key)。常见的公钥加密算法有 RSA。
还是以A 给 B 发送数据为例,公钥加密算法由接收者 B 发起

HTTPS通信过程

理解了上面的概念,就要来说说最重要的HTTPS的通信过程,一个HTTPS请求实际上包含了两次HTTP传输,可以细分为8步:

解析上面的8个步骤

数字证书

通过观察HTTPS的传输过程,我们知道,当服务器接收到客户端发来的请求时,会向客户端发送服务器自己的公钥,但是黑客有可能中途篡改公钥,将其改成黑客自己的,所以有个问题,客户端怎么信赖这个公钥是自己想要访问的服务器的公钥而不是黑客的呢? 这时候就需要用到数字证书。

在讲数字证书之前,先说一个小例子。假设一个镇里面有两个人A和B,A是个富豪,B想向A借钱,但是A和B不熟,怕B借了钱之后不还。这时候B找到了镇长,镇长给B作担保,告诉A说:“B人品不错,不会欠钱不还的,你就放心借给他吧。” A听了这话后,心里想:“镇长是全镇最德高望重的了,他说B没问题的话那就没事了,我就放心了”。 于是A相信B的为人,把钱借给了B。

与此相似的,要想让客户端信赖公钥,公钥也要找一个担保人,而且这个担保人的身份必须德高望重,否则没有说服力。这个担保人的就是证书认证中心(Certificate Authority),简称CA。 也就是说CA是专门对公钥进行认证,进行担保的,也就是专门给公钥做担保的担保公司。 全球知名的CA也就100多个,这些CA都是全球都认可的,比如VeriSign、DigiCert、GlobalSign等,国内知名的CA有WoSign。

那CA怎么对公钥做担保认证呢?CA本身也有一对公钥和私钥,CA会用CA自己的私钥对要进行认证的公钥进行非对称加密,此处待认证的公钥就相当于是明文,加密完之后,得到的密文再加上证书的过期时间、颁发给、颁发者等信息,就组成了数字证书。

不论什么平台,设备的操作系统中都会内置100多个全球公认的CA,说具体点就是设备中存储了这些知名CA的公钥。当客户端接收到服务器的数字证书的时候,会进行如下验证:

通过浏览器直接获取服务器的公钥很容易,各个浏览器操作大同小异。百度现在已经实现了全站点HTTPS,我们就以github为例如何从Chrome中获取其公钥。

在常规页面可以看到证书的颁发者,颁发对象和有效期

这里先解释一下什么是证书链。前面说到过,DigiCert是一个全球知名的CA,但是一般情况下,CA不会用自己的私钥去直接签名某网站的数字证书,一般CA会首先签发一种证书,然后用这种证书再去签发百度等的数字证书。在此例中,DigiCert签发了下属的DigiCert SHA2 Extended Validation Server CA证书,然后下属证书又签发了github.om,DigiCert位于最顶端,类似于根结点,因此叫做根CA,中间有可能有多个下属CA,这样从根CA到下属CA,再到最终的网站的证书,这样自上而下形成了一条证书链。如果想要查看证书链中的某个证书,只需要选中它,比如选中了DigiCert,然后点击下面的“查看证书”按钮就会弹出另一个对话框,在其中可以查看DigiCert的数字证书,当然也可以将其导出成证书文件保存在硬盘上。

总结

以上就是HTTPS的相关内容,下一篇文章再讲下Android中如何使用HTTPS。

说到这,我想起一个很久前的故事,某日我写了一篇博客,一个心怀梦想的年轻人看了我的博客,并给我打了2块钱的赏,今后几年他事业顺利,婚姻幸福,身体健康,越来越帅,从此走上人生巅峰。

上一篇下一篇

猜你喜欢

热点阅读