一、加密方式
1. 概述
一般加密思路:对称加密/非对称加密。对称加密使用的密钥和解密使用的密钥是相同的;非对称是不同的,分为公钥和私钥,公钥加密私钥才能解开,私钥加密公钥才能解开
2. 对称加密
加密流程:客户端和服务端约定一个密钥,发送请求时使用密钥加密;接收时使用密钥解密
问题:客户端与服务端如何约定密钥。
- 若在网上传输密钥,可能会被黑客截取;
- 线下传输密钥,由于客户端过多,不现实
3. 非对称加密
加密流程:
- 服务端将非对称密钥放在网站中,不在网络上传输,但是对应的公钥,可以在互联网上随意传播
- 客户端接收到服务端的公钥,可以使用公钥加密,传输数据
问题:
- 由于公钥是公开的,攻击者可以解密服务端传输给客户端的数据
- 解决方法:客户端需要有自己的公钥和私钥,客户端将公钥传输给服务端,在服务端向客户端传输数据时,使用客户端公钥加密
4. 数字证书
a. 非对称加密的问题
非对称加密的问题:
- 如何将非对称加密公钥传给对方
- 方法:放在公网地址上供下载;建立连接时,传送给对方
公钥传输的问题:如何鉴别公钥是对的,而不是攻击者伪造一个公钥,用以拦截数据
创建公/私钥指令:
openssl genrsa -out cliu8siteprivate.key 1024 // 创建私钥
openssl rsa -in cliu8siteprivate.key -pubout -out cliu8sitepublic.pem // 创建公钥
b. 证书
证书组成:公钥、证书所有者、证书发布机构、证书有效期
生成证书的流程:
- 发起证书请求,将申请者公钥、申请者相关信息发给权威机构认证(CA)
openssl req -key cliu8siteprivate.key -new -out cliu8sitecertificate.req
- 权威机构会对公钥以及相关信息做HASH计算,得到HASH值,该计算过程不可逆。在把信息发送出去时,把HASH值加密,作为签名的一部分一起发出去
openssl x509 -req -in cliu8sitecertificate.req -CA cacertificate.pem -CAkey caprivate.key -out cliu8sitecertificate.pem
- CA用自己的私钥给请求签名的公钥签名,相当于给公钥拥有者背书
验证公钥真实性的流程:
- 客户端不会从服务端获取公钥,而是获取证书,证书有发布机构CA
- 客户端获取发CA的公钥,解密服务端证书的签名。解密成功,HASH与明文信息的HASH值一致,则说明服务端证书没有问题
CA的问题:
- 如何验证CA 的公钥的正确性
- 解决方法:CA的公钥由上级CA签名,层层授信背书,直到全球皆知的几个著名大 CA(root CA);Self-Signed Certificate,自签名
二、HTTPS的工作模式
HTTPS加密思路:公钥私钥主要用于传输对称加密的秘钥,而真正的双方大数据量的通信都是通过对称加密进行的
HTTPS通讯流程:
- 客户端发送client hello报文,报文中包含TLS 版本信息、加密方式、随机数等
- 服务端接收到客户端报文后,发送Server Hello报文,报文包含加密套路和随机数等信息
- 服务端发送Certificate报文,报文中为包含服务端公钥的CA证书
- 服务端发送Server Hello Done报文
- 客户端接收到Server hello done报文后,在CA仓库中找到对应的CA公钥(此过程可能会涉及到递归查询父CA机构),解密CA证书,计算HASH值以校验证书是否被篡改。若校验通过,证明证书可信,即可取出服务端公钥进行使用
- 客户端使用算法随机生成Pre-master Secret,并将其放入Client Key Exchange报文中,用证书中的公钥加密,再发送给服务器
- 服务端使用私钥解密客户端的Client Key Exchange报文,获取Pre-master Secret,此时,客户端和服务端都要三个随机数(客户端client hello/服务端client hello/客户端pre-master获取到的随机数),由此计算出对称密钥
- 客户端发送Change Cipher Spec报文,之后Encrypted Handshake Message,将已经商定好的参数等,采用协商密钥进行加密,发送给服务器用于数据与握手验证
- 服务端接收到客户端的报文后,发送Change Cipher Spec报文,并且也发送 Encrypted Handshake Message。
- 双方握手结束后,客户端和服务端即可使用对称密钥对传输的数据进行加密,后续传输流程与HTTP相似
注意:HTTPS可以使用单向认证(客户端验证服务端CA证书),也可以开启双向验证(客户端和服务器端均验证对方CA证书)
三、重放和篡改
HTTPS问题:
重放:截获报文,将报文重发N次
解决方法:Timestamp 和 Nonce 随机数联合起来,然后做一个不可逆的签名来保证。将Nonce作为唯一键(或Nonce+Timestamp),若有重复则丢弃
篡改:攻击者篡改Timestamp 和 Nonce
解决方法:使用签名算法保证Timestamp 和 Nonce不可篡改,若报文校验到被篡改,直接丢弃