前记
这几天面试,经常会问道一个接口的安全问题,我答的就很糊,希望通过这个「安全篇」系列可以搞定
我碰到的是问三次握手,四次挥手,流量控制,滑动窗口,快速重试,https和http的区别
http权威指南
HTTP
明文传输,中间人攻击
Https原理
就是将http的数据包再通过SSL/TLS加密后传输
SSL(Secure Sockets Layer) 安全套接层 TLS(Transport Layer Security)传输层安全协议 是一套东西
- 用户在浏览器发起https请求,默认使用服务端的443端口进行连接
- https需要使用一套CA数字证书,证书内会附带一个公钥PUB,而与之相对的私钥private保留在服务端不公开
- 服务端收到请求,返回配置好的包含公钥的证书给客户端
- 客户端收到证书,校验合法性,包括有效期内,证书的域名和请求的域名是否匹配
- 客户端生成一个用于对称加密的随机KEY,并用证书内的公钥pub进行加密,发送给服务端
- 服务端收到随机key的密文,使用与公钥pub对应的私钥private进行解密,得到客户端真正想发送的随机key
- 服务端使用客户端发送过来的随机key对要传输的http数据进行对称加密,将密文返回给客户端
- 客户端使用随机key对称密文解密,得到http数据明文
CA颁发机构
当服务端向客户端返回公钥A1的时候,中间人将其替换哼自己的公钥B1传送给浏览器。客户端无法确认收到的公钥是不是真的是服务端发来的。为了解决这个问题,互联网引入了一个工信机构,就是CA
服务端在使用HTTPS前,去经过认证的CA机构申请颁发一个数据证书,数字证书包含证书持有者,有效期,公钥等消息。服务端将证书发送给客户端,客户端校验证书身份和要访问的网站身份确实一致后再进行加密操作
但是中间人也可以额改动证书的公钥部分
私钥除了解密之外用途还有一个,就是数字签名,其实就是一种防伪技术,只要有人串改了证书,那么数字签名必然失败
- CA机构拥有自己的一对公钥私钥
- CA机构在颁发证书时对证书明文信息进行哈希
- 将哈希值用私钥进行加密,得到数字签名
明文数据和数字签名组成证书,传递给客户端
- 客户端得到证书,分解明文部分test和数字签名sig1
- 用ca机构的公钥进行解签,得到sig2
- 用证书里声明的哈希算法对明文test部分进行哈希得到h
- 当自己计算的哈希t和解签后的sig2相同,证明没有被篡改