HTTPS协议
说道HTTPS协议就要说一说HTTP,HTTP的特性就是明文传输,因此在传输的每一个环节都有可能被第三方窃取或者篡改,具体来说,HTTP数据经过TCP层,然后经过WIFI路由器、运营商和目标服务器,这些环节中都有可能被中间人拿到数据并进行篡改,为了防范这一类的攻击,我们不得不引入新的加密方案HTTPS。
HTTPS并不是一个新的协议,而是一个加强版的HTTP,其原理是在HTTP和TCP之间加了一层中间层,当HTTP和TCP之间进行通信时并不会像以前那样直接通信,而是经过了一层中间层进行加密,加密后的数据包回传给TCP,相应的,TCP必须将数据包解密才能上传给HTTP。
对称加密
所谓对称加密就是指加密和解密的秘钥都是相同的,了解了原理下面就简单的实现下这个过程。
- 浏览器发送它所支持的加密套件列表和一个随机数client-random,加密套件列表指的是加密的方式列表
- 服务器会从加密列表中选一种加密套件,然后生成一个server-random,并将server-random和加密套件返回给浏览器
- 最后浏览器和服务器分别反悔确认消息
这样浏览器和服务器都有相同的client-random和server-random,然后他们都用相同的方法将client-random和server-random混合起来生成一个秘钥,最终就可以用这个秘钥来解密我们加密的文件。
但是由于HTTP是明文传输,这意味着黑客也可以拿到我们的加密套件和随机数,这样的话任然能够破解我们加密的数据。
非对称加密
为了解决对称加密的的问题,就出现了非对称加密,非对称加密是指加密算法有两把秘钥, 如果有 A、 B 两把密钥,如果用 A 加密过的数据包只能用 B 解密,反之,如果用 B 加密过的数据包只能用 A 解密。
在 HTTPS 中,服务器会将其中的一个密钥通过明文的形式发送给浏览器,我们把这个密钥称为公钥,服务器自己留下的那个密钥称为私钥 。
- 首先浏览器还是发送加密套件列表给服务器。
- 然后服务器会选择一个加密套件,不过和对称加密不同的是,使用非对称加密时服务器上需要有用于浏览器加密的公钥和服务器解密 HTTP 数据的私钥,由于公钥是给浏览器加密使用的,因此服务器会将加密套件和公钥一道发送给浏览器。
- 最后就是浏览器和服务器返回确认消息。
虽然非对称加密解决了秘钥的泄露问题,但是同时它自己也存在一些问题:
- 非对称加密效率低
- 无法保证服务器发送给浏览器的数据安全。虽然浏览器端可以使用公钥来加密,但是服务器端只能采用私钥来加密,私钥加密只有公钥能解密,但黑客也是可以获取得到公钥的,这样就不能保证服务器端数据的安全了。
对称加密和非对称加密配合使用
可以发现,对称加密和非对称加密,只用前者会有安全隐患,只用后者性能消耗又太大。那我们能不能把两者结合,保证性能的同时又能保证安全呢?
下面说说具体流程:
- 浏览器会向服务器发送client_random和加密套件列表
- 服务器收到后返回serve_random和加密方法以及公钥
- 浏览器收到后又生成另外一个随机数pre_random,并使用公钥传输到服务器
- 服务器用私钥解密这个被加密的pre_random
这样的话浏览器和服务器都拥有三个相同的凭证:client_random、server_random、pre_random然后两者都用相同的加密方法混合三个随机数生成最终的秘钥。
添加数字证书
尽管通过两种加密方式结合,能够很好的实现加密传输,但是任然会存在一些问题,黑客如果采用DNS劫持,将目标地址替换成自己的的服务器地址,然后黑客又伪造一份公钥和私钥,照样能够进行数据传输。
事实上HTTPS在上述结合对称和非对称加密的基础上,又添加了数字证书认证的步骤。其目的就是让服务器证明自己的身份。
传输流程:
为了获取这个证书,服务器运营者需要向第三方认证机构获取授权,这个第三方机构也叫CA(Certificate Authority), 认证通过后 CA 会给服务器颁发数字证书。
这个数字证书有两个作用:
- 服务器向浏览器证明自己的身份。
- 把公钥传给浏览器。
这个验证的过程发生在什么时候呢?
当服务器传送server_random、加密方法的时候,顺便会带上数字证书(包含了公钥), 接着浏览器接收之后就会开始验证数字证书。如果验证通过,那么后面的过程照常进行,否则拒绝执行。
认证过程:
浏览器拿到数字证书后,如何来对证书进行认证呢?
首先,会读取证书中的明文内容。CA 进行数字证书的签名时会保存一个 Hash 函数,来这个函数来计算明文内容得到信息A,然后用公钥解密明文内容得到信息B,两份信息做比对,一致则表示认证合法。
当然有时候对于浏览器而言,它不知道哪些 CA 是值得信任的,因此会继续查找 CA 的上级 CA,以同样的信息比对方式验证上级 CA 的合法性。一般根级的 CA 会内置在操作系统当中,当然如果向上找没有找到根级的 CA,那么将被视为不合法。
摘要算法
实现完整性的手段主要是摘要算法,摘要算法可以理解为一种特殊的压缩方法,它能够把任意长度的数据“压缩”成固定长度,而且独一无二的字符串,就好像是给这段数据生成了一个数字“指纹”。现在常用的有SHA224、SHA256、SHA384。
摘要算法保证了“数字摘要”和原文是完全等价的,所以,我们只要在原文后附上他的摘要,这就能保证数据的完整性。
如果黑客在中间哪怕改动了一个标点符号,摘要也是完全不同的,网站计算比对就会发现消息被篡改,是不可信的。
不过摘要算法不具有机密性,如果明文传输,那么黑客可以修改消息后把摘要也一起改了,网站还是鉴别出来完整性,所以真正的完整性要建立在机密性上。
HTTPS和HTTP的区别
-
默认端口的不同,http为80 https为443
-
HTTPS在传输过程中数据的机密性强于HTTP
-
HTTPS可以保证传输数据的完整性
-
HTTPS能够确认对方的真实身份