涉及到的一些概念:对称加密、非对称加密、数字签名、数字证书。
为什么要加密?
- 因为http传输内容是明文的,明文数据在传输过程中会经历,中间代理服务器、路由器、wifi热点、通信服务运营商等多个物理节点,如果信息传输过程被劫持,传输内容会完全暴露;
- 劫持者还可以篡改传输信息,而不被对方察觉,这就是中间人攻击;
- 所以,需要对传输的信息进行加密。
什么是对称加密?
简单说,类似于日常生活中的钥匙,两个人各有一把相同钥匙,可以开同一把锁。
对称加密中的密钥,可以加密一段信息,也可以对加密后的信息进行解密。
什么是非对称加密?
非对称加密有两把密钥,公钥和私钥。通常,服务端保留私钥,客户端保留公钥。
用公钥加密的内容必须用私钥才能解开,同样,用私钥加密的内容,用公钥才能解开。
对称加密 + 非对称加密 的过程?
- 服务器拥有非对称加密的公钥A、私钥A’ ;
- 客户端向服务器发请求,服务器把公钥A 明文传输给客户端;
- 客户端随机生成一个用于对称加密的密钥X,用公钥A 加密后传给服务器;
- 服务器拿到后,用私钥A’ 进行解密,得到密钥X;
- 这样服务器和客户端都有密钥X了。
如何保证浏览器收到的公钥一定是该网站的公钥?
什么是数字证书?
数字证书,类似于身份证一样,由国家授权,公安机关办理。
数字证书由CA 机构办理,数字证书里包含 证书持有者信息、公钥信息等。
- 网站在使用HTTPS 前,需要向CA机构申领一份数字证书;
- 服务器把证书传输给浏览器,浏览器从证书里获取公钥即可;
如何防止数字证书在传输过程中被篡改?
利用数字签名,把证书原本的内容生成一份“签名”,对比签名和证书内容是否一致就能判断出是否被篡改。
每次进行HTTPS请求时,都必须在 SSL/TLS 层进行握手,传输密钥吗?
当然不是。
服务器会为每个浏览器维护一个 session ID,服务器拿到密钥后,把它存到对应的 Session ID 下,之后浏览器每次请求都会携带session ID,服务器根据 Session ID 找到对应的密钥进行加密、解密操作,这样就不必每次重新生成密钥了。
参考文献:彻底搞懂HTTPS的加密原理