最近苦逼找工作面试,携程的面试官问我https原理,我回答的不是特别好。所以自己谷歌了一下,在此做一下整理。
先说说为什么用https,而放弃http。
因为http的请求,请求数据都是“裸奔”在互联网当中,一旦被窃取有很大的风险。总体来说http请求有三大风险:
1.窃取风险:黑客可以获知通信内容
2.篡改风险:既然黑客可以窃取,那么也可以篡改数据。
3.冒充身份:黑客可以冒充他人身份进行通讯
其中1,2好理解。3的话是因为没有一个身份认证的机制,客户端无法验证正在通讯的对方的身份,不知道是正规服务器还是黑客。那么怎么解决上面三个问题呢?
1,2可以通过数据加密的方式进行解决,因为数据一旦加密,黑客即便获取也很难破解。加密方式可以有下面四种:
a.对称加密:加密和解密都是使用的同一个秘钥。例如DES、AES-GCM、ChaCha20-Poly1305 等。
b.非对称加密:分公钥和私钥。公钥和算法都是公开的,私钥不公开。公钥加密,私钥解密。或者私钥加密,公钥解密。由于其算法特性,其能加密的数据长度是有限的。例如:RSA、DSA、ECDSA、 DH、ECDHE
c.哈希算法:经常用的MD5就属于哈希算法,它是把任意长度的信息转换为较短的固定长度的值,通常其长度要比信息小得多,且算法不可逆。例如:MD5、SHA-1、SHA-2、SHA-256 等
d.数字签名:将信息用哈希算法hash一下,得到一个摘要,再对摘要做非对称加密。(之所以对摘要做非对称加密是因为非对称加密能处理的数据长度有限)
那么究竟这些加密方式该如何选择:
a.对称加密:
对称加密之后,黑客即使窃取到信息,没有密钥也无法解密,保证了数据安全。但是用对称加密的话,需要服务器和客户端各持有一个秘钥。对于不同的客户端,不同的服务器,要存储和管理不同的秘钥,太麻烦。而且每个客户端,服务端的安全级别不同,密钥有可能泄露。
b.非对称加密:
因为公钥和加密算法是公开的,所以黑客也可以拥有公钥。这样从服务器返回的数据,黑客可以窃取并且解密,保证不了数据安全。
c.对称加密+非对称加密:
如图:客户端将对称加密秘钥和算法用公钥加密传给服务器,服务器收到之后,用私钥解密,获取到对称加密算法和对称秘钥。然后客户端和服务器就可以用对称加密进行数据传输。
但是有两个问题:一是客户端如何获取公钥,二是怎么判断服务器不是黑客(http请求的冒充身份问题)
d.获取公钥和确认服务器身份
1、获取公钥:提供一个下载公钥的地址,会话前让客户端去下载。(缺点:a.下载地址有可能是假的;b.客户端在每次会话前都要去下载公钥很麻烦)
2、会话开始时,服务器把公钥发给客户端。(缺点:黑客冒充服务器,发给客户端假的公钥)
所以需要一种安全的获取公钥的机制,解决冒充的问题。那就是SSL证书机制:
如上图所示,在第 ② 步时服务器发送了一个 SSL 证书给客户端,SSL 证书中包含的具体内容有:
(1)证书的发布机构 CA
(2)证书的有效期
(3)公钥
(4)证书所有者
(5)签名
………
3、客户端收到服务端发送来的SSL证书后,会对真伪进行校验,以浏览器为例说明如下:
1)浏览器读取证书中的证书所有者和有效期,进行一一校验。
2)浏览器开始查找操作系统中已内置的受信任的证书发布机构CA,与服务器发来的证书中的颁发者CA对比,用来校验证书是否为合法机构颁发。如果找不到,浏览器就会报错,说明服务器发来的证书是不可信任的。
3)如果找到,浏览器会从操作系统中取出CA的公钥,对发来的证书中的签名进行解密。
4)浏览器用同样的hash算法计算hash值,跟解密得到的hash值作比较,如果相同,则说明证书有效。那么可以取出证书中的公钥用于后续加密了。
4、所以通过发送SSL证书的形式,既解决了获取公钥的问题,又解决了证书信任的问题,一箭双雕。https加密就此形成。相对于http,https加密具有以下优点:
1)通信过程加密,黑客无法窃听
2)具有校验机制,一旦被篡改,双方立刻就会发现。
3)配备SSL证书,防止身份被冒充。
以上就是关于https加密原理的总结。
参考:https://blog.upyun.com/?p=1347