# HTTPS
HTTP 为什么不安全?由于是明文传输,可能被窃听,可能被篡改,无法认证确认对方身份。
攻击手段:
- XSS,即为(Cross Site Scripting),中文名为跨站脚本,主要方式是嵌入一段远程或者第三方域上的 JS 代码
- CSRF(Cross-site request forgery),中文名为跨站请求伪造,攻击者盗用了你的身份,以你的名义发送恶意请求。
# TLS/SSL
TLS/SSL 的功能实现主要依赖于三类基本算法:
- 非对称加密实现身份认证和密钥协商
- 对称加密算法采用协商的密钥对数据加密
- 散列函数验证信息的完整性,针对于密钥泄露的不安全性
结合三类算法的特点,TLS 的基本工作方式:
- 客户端使用非对称加密与服务器进行通信,实现身份验证并协商对称加密使用的密钥
- 然后对称加密算法采用协商密钥对信息以及信息摘要进行加密通信,不同的节点之间采用的对称密钥不同,从而可以保证信息只能通信双方获取
# 对称加密
- 相同的密钥可以用于信息的加密和解密,掌握密钥才能获取信息,能够防止信息窃听,通信方式是 1 对 1(前提示密钥不泄露)
- 算法公开、计算量小、加密速度快、加密效率高
- 客户端、服务器双方都需要维护大量的密钥,维护成本很高
- 因每个客户端、服务器的安全级别不同,密钥容易泄露,交易双方都使用同样钥匙,安全性得不到保证
# 非对称加密
- 非对称加密算法的特点加密和解密分别使用不同的密钥,客户端用公钥对请求内容加密,服务器使用私钥对内容解密,反之亦然。
- 相对来说加解密速度较慢,使用非对称加密在数据加密解密过程需要消耗一定时间,降低了数据传输效率
- 公钥是公开的,所以针对私钥加密的信息,黑客截获后可以使用公钥进行解密,获取其中的内容
- 公钥并不包含服务器的信息,使用非对称加密算法无法确保服务器身份的合法性,存在中间人攻击的风险,服务器发送给客户端的公钥可能在传送过程中被中间人截获并篡改
# 完整性验证算法
- 常见的有 MD5、SHA1、SHA256,该类函数特点是函数单向不可逆、对输入非常敏感、输出长度固定,针对数据的任何修改都会改变散列函数的结果,用于防止信息篡改并验证数据的完整性
- 在信息传输过程中,散列函数不能单独实现信息防篡改,因为明文传输,中间人可以修改信息之后重新计算信息摘要,因此需要对传输的信息以及信息摘要进行加密
# 密钥协商
# 身份验证
服务方 Server 向第三方机构 CA 提交公钥、组织信息、个人信息(域名)等信息并申请认证。
# 为什么需要 HTTPS
HTTPS 是一种计算机网络进行安全通信的传输协议,实际利用 HTTP 进行通信,但是用 SSL/TLS 来加密数据包。它的出现主要是为了保护交互数据的隐私与完整性。
对于客户端和服务端通信数据的非对称加密,最大的风险是:MITM: Man-in-the-MiddleAttack
即公钥被中间人拿走后并进行篡改,这样接受者就会接收到假信息。
所以,核心的问题是:防止公钥被掉包,收到公钥的时候要确认这个公钥确实是指定的发送者发送的,而不是别人的。
HTTPS 使用 证书+数字签名
的方法来解决这个问题。步骤如下:
- 服务端申请 SSL 证书
- 客户端与服务端建立连接时,服务端会向客户端发送 SSL 证书
- 浏览器开始查找操作系统中已内置的受信任的证书发布机构 CA,与服务器发来的证书中的颁发者 CA 比对,用于校验证书是否为合法机构颁发
- 如果找到,那么浏览器就会从操作系统中取出 颁发者 CA 的公钥,然后对服务器发来的证书里面的签名进行解密
- 浏览器使用相同的 hash 算法计算出服务器发来的证书的 hash 值,将这个计算的 hash 值与证书中签名做对比
- 对比结果一致,则证明服务器发来的证书合法,没有被冒充
- 此时浏览器就可以读取证书中的公钥,用于后续加密了
# 总结
HTTPS 就是使用 SSL/TLS
协议进行加密传输,让客户端拿到服务器的公钥,然后客户端随机生成一个对称加密的秘钥,使用公钥加密,传输给服务端,后续的所有信息都通过该对称秘钥进行加密解密,完成整个 HTTPS 的流程。