HTTPS
我们都知道 HTTPS 传输安全,为什么安全呢?密码学保证?下面介绍一些 HTTPS 用到的技术。
SSL/TLS
SSL(Secure Sockets Layer),中文叫安全套接层,是网景公司 90 年代中期设计来解决 HTTP 协议明文传输的缺点(嗅探、劫持、篡改)。
到 1999 年,IETF 把 SSL 标准化,标准化之后名称改为 TLS(Transport Layer Security),中文叫传输层安全协议。
HTTPS
什么是 HTTPS?
HTTPS = HTTP + SSL/TLS。
即不安全的 HTTP 协议加上 SSL/TLS 等于安全的 HTTPS。
加密解密
加密和解密是一对互逆的数学运算:
加密:明文 + 密钥 = 密文
解密:密文 + 密钥 = 明文
对称加密
对称加密的意思就是加密和解密使用相同的密钥,例如在压缩文件上设置密码,解密就需要输入相同的密码。
非对称加密
非对称加密则使用不同的密钥(公钥和私钥)进行加密解密。
密钥交换
网站和浏览器之间要实现安全的密钥交换该如何实现?
方案一:使用对称加密算法
如果单纯使用对象加密算法,浏览器和网站之间必须要交换密钥,密钥直接用明文传输很容易被窃取,无法保证密钥的安全性。
方案二:使用非对称加密算法
- 网站基于非对称加密算法随机生成一对密钥对 x,y,目前还很安全,只有网站知道
- 网站把 x 留在手里,把 y 用明文传输到浏览器(y 有可能被窃取)
- 浏览器拿到 y 之后,先随机生成第三个对称加密的密钥 z,然后用 y 加密 z 得到最新的 f(本质上就是用非对称加密保证对称加密的安全性),将 f 发送到网站(因为 x,y 是成对的,只有 x 才能解密 y 加密的结果,所有 y 泄露也无法解密 k)
- 网站拿到 f 之后,用 x 解密得到 z,至此浏览器和网站都有对称加密的密钥 z,可以进行通信加密
思考一下,方案二是否安全和完美?
依旧不安全,方案二可以在一定程度上防止嗅探,但无法防范网络数据篡改(中间人攻击)。
在网站和浏览器交换密钥的过程中,中间人接收网站发送的密钥 y 保存下来,改用自己生成的密钥对伪造成网站与浏览器交互,同时使用密钥 y 伪造成浏览器与网站交互。
方案二不安全的根源是缺乏可靠的身份认证,浏览器无法鉴别自己收到的密钥是不是来自网站。
因此需要引入 CA 证书机制(身份认证),基于 CA 证书进行密钥交换(具体 CA 机制可查看另一篇介绍 CA 的文章)。
此时得到方案三:
- 网站首先花钱从权威 CA 机构那里购买一个数字证书,证书通常包含一个私钥和一个公钥证书文件
- 浏览器访问网站时将公钥证书文件发送给浏览器
- 浏览器验证收到的证书(权威机构担保真假,主流浏览器和操作系统都会内置权威 CA 机构的根证书)
- 如果证书可信,就随机生成一个对称加密密钥 k,使用公钥加密 k,得到密钥 c
- 将密钥 c 发送到网站,网站根据私钥解密出密钥 k,至此密钥交换完成
这就是 HTTPS 加密传输的过程。