开篇
在前端面试博弈过程中经常会被问到https、ssl相关内容,我们对比总结一下。
在http协议中可能存在信息窃听或者身份伪装的安全问题,使用https可以通信机制可以有效的防止这些问题。
https = http + ssl
背景
http 和 https的区别
http的缺点
- 使用明文通信,内容可能会被窃听,并且随意篡改
- 不验证通信双方身份,有可能遭遇伪装
- 无法证明报文的完整性,内容可能遭到篡改
HTTP + 加密 + 认证 + 完整性保护 = HTTPSHTTPS 是身披SSL外壳的HTTP
https有以下特性
TLS/SSL
内容加密数字证书(CA)
验明身份,防止中间人攻击MD5、SHA-1
等散列值方法防止信息篡改
加密方式
对称加密
数据加解密使用同一份密钥,加解密速度快,效率高,缺点是密钥的管理难度大,一旦密钥传输泄露,那就没啥用处了。
所以解决办法就是下面的
非对称加密
使用一对非对称密钥。一把叫私有密钥,另一把叫公有密钥,私有密钥存储于服务器,公有密钥随意发送。也就是说,发送密文方使用对方的公有密钥进行加密,对方接受到信息后,使用私有密钥进行解密。再不使用私有密钥情况下很难还原信息。
混合加密
HTTPS采用对称加密和公开密钥加密两者混合加密,两者都有各自的优点。对称加密处理速度快,但密钥无法安全发送给对方;非对称加密处理速度慢,但密钥能够安全交换。 但如果我们将两种加密方式一起使用,则两种加密方式就能互补。也就是说,利用非对称加密方式安全地交换在共享密钥加密中要使用的密钥,在确保密钥安全前提下,使用对称加密方式进行通信
SSL证书
数字证书的一种,遵循SSL协议,由受信任的数字证书颁发机构CA,在验证服务器身份后颁发,具有服务器身份验证和数据传输加密功能,我常用的是 DigiCert 免费版,有效期只有一年。长期的证书还是很贵的。
正文内容
SSL 握手过程
开始加密通信之前,客户端和服务器首先必须建立连接和交换参数,这个过程叫做握手(handshake)。如图:
- 第一步,爱丽丝给出协议版本号、一个客户端生成的
随机数(Client random)
,以及客户端支持的加密方法。 - 第二步,鲍勃确认双方使用的加密方法,并给出数字证书、以及一个服务器生成的
随机数(Server random)
。 - 第三步,爱丽丝确认数字证书有效,然后生成一个新的
随机数(Premaster secret)
,并使用数字证书中的公钥,加密这个随机数,发给鲍勃。 - 第四步,鲍勃使用自己的私钥,获取爱丽丝发来的随机数(即Premaster secret)。
- 第五步,爱丽丝和鲍勃根据约定的加密方法,使用前面的三个随机数,生成
"对话密钥"(session key)
,用来加密接下来的整个对话过程。
白话版本
1、客户端生成一个随机数
,带着客户端所支持的加密方法List
,传递给服务器端,自己的随机数先存着。
2、服务器接收到这个随机数,先存着,生成一个新的随机数
,并从客户端传过来的加密方法List中选择一个最合适的加密方法
,还有自己的数字证书(公钥
),三个一并发送给客服端。
3、客户端确认数字证书有效,拿到随机数先存着,再生成一个新的随机数
,然后用公钥加密这个随机数,生成一个 预主秘钥(Premaster secret)
,将预主秘钥发送给服务器端。 当前步骤中的预主秘钥是本次加密的关键,前2个随机数都是明文传送,当前这个使用公钥加密,所以不容易拿到,即使拿到也没有关系,因为只有服务器上的秘钥才能解析,才知道第三个随机数是什么。
4、服务器接收到预主秘钥之后,用私钥解密得到随机数。到此,客服端和服务器端都知道了三个 随机数。 用这个三个随机数生成 对话秘钥(session key)
,用来加密接下来的所有对话过程。
来张图就是这个样子:
总结:HTTPS 使用的混合加密的方式来进行加密处理的。最重要的加密是第三个随机数的传输,以此来保证本次传输的安全性。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。