HTTPS
# 与HTTP区别?
- HTTP 是超文本传输协议,信息是明文传输,存在安全风险的问题。HTTPS 则解决 HTTP 不安全的缺陷,在 TCP 和 HTTP 网络层之间加入了 SSL/TLS 安全协议,使得报文能够加密传输。
- HTTP 连接建立相对简单, TCP 三次握手之后便可进行 HTTP 的报文传输。而 HTTPS 在 TCP 三次握手之后,还需进行 SSL/TLS 的握手过程,才可进入加密报文传输。
- 两者的默认端口不一样,HTTP 默认端口号是 80,HTTPS 默认端口号是 443。
- HTTPS 协议需要向 CA(证书权威机构)申请数字证书,来保证服务器的身份是可信的。
# HTTPS解决了HTTP明文传输哪些风险?
- 窃听风险:通信使用明文(不加密),内容可能会被窃听。比如,账号信息容易泄漏,那你号没了。
- 冒充风险:不验证通信方的身份,因此有可能遭遇伪装。比如,访问假的淘宝、拼多多,那你钱没了。
- 篡改风险:无法证明报文的完整性,所以有可能已遭篡改。比如,网页上植入垃圾广告,视觉污染,眼没了。
# HTTPS解决方案
- 混合加密的方式实现信息的机密性,解决了窃听的风险。
- 摘要算法的方式来实现完整性,它能够为数据生成独一无二的「指纹」,指纹用于校验数据的完整性,解决了篡改的风险。
- 将服务器公钥放入到数字证书中,解决了冒充的风险。
# 混合加密
HTTPS 采用的是对称加密和非对称加密结合的「混合加密」方式
- 在通信建立前采用非对称加密的方式交换「会话秘钥」,后续就不再使用非对称加密。
- 在通信过程中全部使用对称加密的「会话秘钥」的方式加密明文数据。
采用「混合加密」的方式的原因:
- 对称加密只使用一个密钥,运算速度快,密钥必须保密,无法做到安全的密钥交换。
- 非对称加密使用两个密钥:公钥和私钥,公钥可以任意分发而私钥保密,解决了密钥交换问题但速度慢。
客户端从CA获得服务器公钥,RSA服务器对公钥加密pre-master发送给服务端,服务端私钥解密取出pre-master,用premaster+客户端随机数+服务端随机数生成会话密钥,后续的对称加密都用这个会话密钥;
# 摘要算法+数字签名
摘要算法:(消息完整性)用摘要算法(哈希函数)来计算出内容的哈希值,也就是内容的「指纹」,这个哈希值是唯一的,且无法通过哈希值推导出内容;
通过哈希算法可以确保内容不会被篡改,但是并不能保证「内容 + 哈希值」不会被中间人替换,因为这里缺少对客户端收到的消息是否来源于服务端的证明
(请假条有请假内容和家长签字,然是签字可能伪造)
(服务端发送的哈希值被别人篡取,但是修改了内容,客户端不知道,只比较哈希值)
数字签名:(消息来源可靠性)通过非对称加密(服务端私钥加密,客户端公钥解密),确认消息身份;私钥加密的是对内容的哈希值;
(签字伪造,需要打电话跟家长确认)
公钥与私钥可以双向加解密,可以用公钥加密内容,然后用私钥解密,也可以用私钥加密内容,公钥解密内容;
- 公钥加密,私钥解密。这个目的是为了保证内容传输的安全,因为被公钥加密的内容,其他人是无法解密的,只有持有私钥的人,才能解密出实际的内容;
- 私钥加密,公钥解密。这个目的是为了保证消息不会被冒充,因为私钥是不可泄露的,如果公钥能正常解密出私钥加密的内容,就能证明这个消息是来源于持有私钥身份的人发送的。
# 数字证书
保证服务器公钥身份,解决冒充风险;
数字证书有什么?
公钥,文件的数字签名及使用算法,有效期等;
服务器将自己的公钥注册到CA;
CA用自己的私钥将服务器的公钥数字签名并颁发数字证书(服务器公钥+CA数字签名);
客户端拿到服务器的数字证书后,使用CA公钥确认服务器的数字证书的真实性,从数字证书获取服务器公钥后,使用它对报文加密后发送;
服务器用私钥对报文解密;
服务端一般私钥加密发送,客户端公钥解密,保证消息不被冒充;
客户端公钥加密发送,服务端私钥解密,保证传输安全;
# 密钥交换算法
RSA
ECDHE
# HTTPS优化
- 密钥交换算法优化
- 证书优化
- 会话重用