HTTP的安全缺陷
- 通信内容不加密,导致被窃听
- 不验证客户端和服务端的身份,导致:
- 服务器伪装
- 响应返回到了其他的客户端
- 海量恶意连接
- 无法证明报文的完整性,导致:请求和响应内容被篡改,这称为中间人攻击
公钥加密技术
- 使用私钥加密的内容,使用公钥解密,反之,使用公钥加密的内容,使用私钥解密
- 服务器生成公钥和私钥,私钥自己保存,公钥对外公开
- 客户端发送请求之前,使用公钥进行加密——由于私钥是服务器私有,即使被截获也无法解密
- 反过来,服务器发送响应之前:
- 对消息执行hash算法,生成摘要
- 对摘要使用私钥加密,生成数字签名
- 将消息和数字信息一起发送到客户端
- 客户端用公钥解密数字签名,得到摘要
- 客户端对消息执行hash算法,与摘要比对,验证消息的真伪
- 如果消息被截获,摘要被解密,由于没有私钥,也就无法生成能用公钥解密的摘要,这样就保证了消息的正确性、完整性,以及服务器的真实性。
- 该过程的漏洞在于:如何防止有人篡改公钥,也就是如何保证公钥的真实性
- 解决:通过CA(数字证书认证),将服务器公钥、用到的hash算法、CA机构信息等,通过CA的私钥加密成数字证书
- 之后服务器发送的消息,都附上数字证书
- 浏览器收到数字证书,用CA的公钥解密,拿到服务器的公钥
- 再将机构信息与本机机构列表比对,验证公钥的真实性
- 如果有人伪造公钥,甚至获得了CA的私钥,其证书中的信息、hash算法等内容也很难与真实网站完全一致。
SSL和HTTPS
- 上述过程仅单向安全,用私钥加密的信息,也就是服务器发出的信息不安全
- 解决办法:先用上述流程验证公钥的真实性,这个过程称为握手
- 在客户端生成随机对称密钥
- 对密钥用公钥加密,发送到服务端,这样就保证了密钥传输的安全性
- 之后全部双向传输都使用对称密钥加密解密
- 上述过程就是SSL
- HTTP+SSL/TLS=HTTPS