为什么要使用https?因为http的报文都是以明文的形式在互联网中传输,容易被中间人获取和篡改。为了安全性,在http的基础上进行ssl或者tls加密。ssl和tls都是传输层的用于加密的协议:SSL(Secure Sockets Layer),安全套接字协议;TLS(Transport Layer Security),传输层安全性协议。ssl是tls的前身,目前多数浏览器已经不支持ssl。
加密方式分为对称加密和非对称加密。对称加密的密钥通常是一方(如发送方)生成,然后传递给另一方(如接收方)。此后传输的信息都通过密钥进行加密和解密。
对称加密存在的问题是,密钥在传输过程中也可能被窃取,这种情况称为劫持攻击,也就是说中间人先窃取密钥,之后通过密钥解密获取信息,篡改后加密再发给接收方。
也就是说我们需要解决密钥的传输安全性。在一些对于安全性要求极高的场景可能通过线下约定密钥,或者通过物理介质(如u盘)传输密钥。非对称加密是一种更可靠的通信方式网络,但加密速度慢、消耗资源多,不适合传大量数据。因此一般通过非对称加密的方式传输密钥,之后再进行对称加密的信息传输。
非对称加密有两对密钥,一个叫公钥一个叫私钥。公钥加密的内容,只有对应的私钥才可以解开,反之亦然。一方生成公钥私钥之后,将公钥发送给另一方,私钥留存在本地。
到这里,其实还是没有解决安全性的问题,因为公钥的传输也是不安全的,中间人还是可以通过劫持公钥之后,用自己的公钥进行再次加密。
举个例子,a和b通信,a生成一对密钥k1和k2进行加密解密,使用k1加密信息后,将k2发送给b,此时c可以劫持k2,c自己生成一对密钥k3和k4,将k4发给b。此时b误以为自己拿到的k4是a发给自己的公钥。
此后,当a发送k1(data1),意为使用k1加密的data1,c劫持k1(data1)后,使用k2解密为data1,篡改为data2,然后加密为k3(data2),发送给b,b收到k3(data2)后,使用k4解密为data2。至此,中间人实现了劫持攻击。
为此,又引入CA:Certificate Authority,即证书颁发机构。网站(或个人 / 设备)要申请证书时,会先向 CA 提交自己的公钥,以及证明身份的材料(比如企业营业执照、网站域名所有权证明)。CA 会通过线下或技术手段严格验证这些信息,确认 “这个公钥确实属于这家网站”。
验证通过后,CA 会把申请者的核心信息(包括公钥、网站域名、证书颁发机构)打包成一个 “证书文件”,然后用CA 自己的私钥对这个文件进行加密。CA 把 “证书文件 + 加密后的文件” 一起发给申请者(比如网站),这个完整的文件就是数字证书,Digital Certificate (DC)。申请者后续传递公钥时,实际传递的是DC,而非单独的公钥。而CA的公钥是公开的,接收方可以通过CA的公钥来解密,获得发送方的公钥。
这样,即使中间人劫持了DC并且进行解密后,由于中间人没有CA的私钥,因此篡改后无法加密。如果中间人使用自己的私钥进行加密,接收方无法解密,就知道信息被篡改了。即使中间人将证书颁发机构一并篡改为自己的信息,让接收方去用自己的私钥解密,这样浏览器也会因为证书颁发机构不够权威,提醒接收方鉴别信息安全。
到这里就可以解释公钥为什么叫公钥,公钥设计上就允许公开传递和使用,任何第三方都可以通过技术手段获取,但是一旦篡改就会露出马脚。
还有一种更隐蔽的攻击方式——剥离攻击。剥离攻击是指攻击者劫持了客户端和服务器之间的连接,攻击者保持自己和服务器之间的 HTTPS 连接,但发送给客户端普通的 HTTP 连接,由于 HTTP 连接是明文传输的,即可获取客户端传输的所有明文数据。因此,原本采用 HTTPS 连接的网站如果变成了 HTTP 连接,浏览器也会发出警告。