这是我朋友面试时被问到的一道面试题。如果是你,你会怎么回答?
你:“嗯,因为它加多了一层SSL层。”
面试官:然后呢?为什么加多了一层就安全了?
什么是SSL?
(⊙o⊙)…不会回答了。。
面试时不仅考察面试者知识的广度还考察面试者知识的一个深度。这是我这段时间面试的一个感受,面试官不仅会从计算机网络、数据库、数据结构、程序设计语言等来问你,考察你知识的一个广度,掌握了哪些知识,还会从知识的一个深度来考察你,掌握的程度多深。所以在回答了“HTTP和HTTPS的区别”的问题后,你以为可以松一口气了,在心里暗自为自己刚刚能回答出面试官的问题而窃喜时,面试官突然追问,HTTPS为什么安全?你可能会猝不及防。这时就会发现可能自己知识广度够了(起码足够秋招面试了),但是知识的深度还不够呀。
所以,多思考多总结,查漏补缺,广度深度两手抓,offer即到家。
我们知道,HTTP请求都是明文传输的,所谓的明文指的是没有经过加密的信息,如果HTTP请求被黑客拦截,并且里面含有银行卡密码等敏感数据的话,会非常危险。为了解决这个问题,Netscape 公司制定了HTTPS协议,HTTPS可以将数据加密传输,也就是传输的是密文,即便黑客在传输过程中拦截到数据也无法破译,这就保证了网络通信的安全。
在正式了解HTTPS协议前,我们要先了解一些密码学的知识。
密码学基础
明文:明文指的是未被加密过的原始数据。
密文:明文被某种加密算法加密之后,会变成密文,从而确保原始数据的安全。密文也可以被解密,得到原始的明文。
密钥:密钥是一种参数,它是在明文转换为密文或将密文转换为明文的算法中输入的参数。密钥分为对称密钥与非对称密钥,分别应用在对称加密和非对称加密上。
对称加密:对称加密又叫做私钥加密,即信息的发送方和接收方使用同一个密钥去加密和解密数据。
对称加密的特点是算法公开、加密和解密速度快,适合于对大数据量进行加密,常见的对称加密算法有DES、3DES、TDEA、Blowfish、RC5和IDEA。
其加密过程如下:明文 + 加密算法 + 私钥 => 密文
解密过程如下:密文 + 解密算法 + 私钥 => 明文
对称加密中用到的密钥叫做私钥,私钥表示个人私有的密钥,即该密钥不能被泄露。
其加密过程中的私钥与解密过程中用到的私钥是同一个密钥,这也是称加密之所以称之为“对称”的原因。由于对称加密的算法是公开的,所以一旦私钥被泄露,那么密文就很容易被破解,所以对称加密的缺点是密钥安全管理困难。
非对称加密:非对称加密也叫做公钥加密。非对称加密与对称加密相比,其安全性更好。对称加密的通信双方使用相同的密钥,如果一方的密钥遭泄露,那么整个通信就会被破解。而非对称加密使用一对密钥,即公钥和私钥,且二者成对出现。私钥被自己保存,不能对外泄露。公钥指的是公共的密钥,任何人都可以获得该密钥。用公钥或私钥中的任何一个进行加密,用另一个进行解密。
被公钥加密过的密文只能被私钥解密,过程如下:
- 明文 + 加密算法 + 公钥 => 密文
- 密文 + 解密算法 + 私钥 => 明文
被私钥加密过的密文只能被公钥解密,过程如下:
- 明文 + 加密算法 + 私钥 => 密文,
- 密文 + 解密算法 + 公钥 => 明文
由于加密和解密使用了两个不同的密钥,这就是非对称加密“非对称”的原因。
非对称加密的缺点是加密和解密花费时间长、速度慢,只适合对少量数据进行加密。
在非对称加密中使用的主要算法有:RSA、Elgamal、Rabin、D-H、ECC(椭圆曲线加密算法)等。
HTTPS通信过程
HTTPS协议 = HTTP协议 + SSL/TLS协议,在HTTPS数据传输的过程中,需要用SSL/TLS对数据进行加密和解密,需要用HTTP对加密后的数据进行传输,由此可以看出HTTPS是由HTTP和SSL/TLS一起合作完成的。
SSL的全称是Secure Sockets Layer,即安全套接层协议,是为网络通信提供安全及数据完整性的一种安全协议。
TLS的全称是Transport Layer Security,即传输层安全协议
HTTPS为了兼顾安全与效率,同时使用了对称加密和非对称加密。数据是被对称加密传输的,对称加密过程需要客户端的一个密钥,为了确保能把该密钥安全传输到服务器端,采用非对称加密对该密钥进行加密传输,总的来说,对数据进行对称加密,对称加密所要使用的密钥通过非对称加密传输。
HTTPS在传输的过程中会涉及到三个密钥:
- 服务器端的公钥和私钥,用来进行非对称加密
- 客户端生成的随机密钥,用来进行对称加密
- 客户端在使用HTTPS方式与Web服务器通信时有以下几个步骤,如图所示。
一个HTTPS请求实际上包含了两次HTTP传输,可以细分为以下几步:
- 客户端向服务器发起HTTPS请求,连接到服务器的443端口。服务器端有一个密钥对,即公钥和私钥,是用来进行非对称加密使用的,服务器端保存着私钥,不能将其泄露,公钥可以发送给任何人。
- 服务器将自己的公钥发送给客户端。
- 客户端收到服务器端的公钥之后,会对公钥进行检查,验证其合法性,如果发现公钥有问题,那么HTTPS传输就无法继续。严格的说,这里应该是验证服务器发送的数字证书的合法性。
- 如果公钥合格,客户端会生成一个随机值,这个随机值就是用于进行对称加密的密钥,我们将该密钥称之为client key,即客户端密钥,这样在概念上和服务器端的密钥容易进行区分。
- 然后用服务器的公钥对客户端密钥进行非对称加密,这样客户端密钥就变成密文了,至此,HTTPS中的第一次HTTP请求结束。
- 客户端会发起HTTPS中的第二个HTTP请求,将加密之后的客户端密钥发送给服务器。
- 服务器接收到客户端发来的密文之后,会用自己的私钥对其进行非对称解密,解密之后的明文就是客户端密钥
- 然后用客户端密钥对数据进行对称加密,这样数据就变成了密文。
- 然后服务器将加密后的密文发送给客户端。
- 客户端收到服务器发送来的密文,用客户端密钥对其进行对称解密,得到服务器发送的数据。这样HTTPS中的第二个HTTP请求结束,整个HTTPS传输完成。
因此被问及“为什么HTTPS安全”的时候,可以这么说,HTTP是明文传输,HTTPS加了一层SSL(安全套接层),是密文传输,可以保证数据的保密性,同时,在交换数据之前,验证一下对方的合法身份,可以保证通信双方的安全。HTTPS通信原理的过程大概是这样:当客户端请求建立HTTPS连接时,服务器会发送公钥(即证书),客户端会对公钥进行检查、验证证书的合法性,验证通过的,会产生随机的对称密钥,服务器的公钥会对客户端的对称密钥进行非对称加密,传输过程中对要发送的数据采用对称加密,对密钥采用非对称加密,然后客户端将加密之后的客户端密钥发送给服务器,服务器收到密文后用私钥对其进行非对称解密,得到客户端密钥;客服端密钥对数据进行对称加密,变成密文然后服务器将密文传输给客户端,客户端收到密文后用客户端密钥对其进行解密即得数据。
仅供参考,如有疏漏恳请各位大佬批评指正~