“你能谈一下HTTPS吗?”面试
“一种比HTTP安全的协议。”算法
“...”安全
若是面试这样说的话那差很少就gg了,其实HTTPS要展开回答的话内容还挺丰富的。本篇文章详细介绍了HTTPS是什么、为何安全以及实现安全的方法,一块儿来学习吧。服务器
本文略长,请保持耐心。网络
HTTPS是以安全为目标的HTTP通道,简单讲是HTTP的安全版。之因此安全是由于它在将HTTP报文发送给TCP以前,先将其发送给了一个安全层(经过SSL协议实现)对报文进行加密。函数
不妨将报文想象成A给B写的一封信,A将信放在一个有锁的盒子里,那么旁人就不能获取信的内容也不能篡改信了。学习
先了解几个术语加密
好比咱们有一个加密函数,算法以下spa
function E(key, p) {
// 将p的每个字母向右移动key位,好比key为3则A-->D、B-->E...
}
E(3, "AB"); // DE
复制代码
明文: "AB" ------ 密文: "DE" ------ 密钥:33d
若是咱们的密钥不同那么咱们的加密函数执行结果就会不一样。
下面来看一下常见的几种加密机制。
咱们以前说过,让报文加密是为了保证我两的聊天内容是秘密的,只有我两能看懂,别人看不懂。那么咱们要约定一个加密方式,好比咱俩递小纸条交流的时候把小纸条装在一个盒子里,而后只有咱们有这个盒子的钥匙。其余人就算拿到这个盒子他也打不开,那就无从窃取内容了。
对称加密就是这个意思:发送方用密钥将明文加密,接收方用一样的密钥解密。
虽然安全性获得了保障,可是仍是存在两个问题:
非对称加密和对称加密是反着干的,对称加密是使用同一个密钥,而非对称加密使用了两个不一样的密钥:公钥、私钥,一个密钥加密的内容只能由另外一个密钥解开。
公钥是众所周知的,而私钥只有主机才持有。
服务器生成了公钥A和私钥B,当客户端想给该服务器发送报文时,首先找到服务器的公钥,而后根据公钥A将报文加密,服务器用私钥B解密。同理,当服务器想给该客户端发送报文时,首先找到客户端的公钥C,而后根据公钥C将报文加密,客户端用本身的私钥D解密。
在确保了信息安全的同时又能够方便密钥的管理。
由此,对称加密和非对称加密的区别是:
. | 对称加密 | 非对称加密 |
---|---|---|
密钥 | 加密解密用相同密钥 | 公钥、私钥,一个加密另外一个解密 |
密钥管理 | 密钥数量大,不方便 | 每一个主机只需管理一对公钥、私钥 |
安全性 | 不安全(并不是该机制不安全,而是双方在约定密钥时可能会密钥泄露) | 安全(不须要经过对话约定密钥) |
加/解密速度 | 快 | 慢 |
那HTTPS是采用的什么机制呢?
剧透,HTTPS对报文采用的对称加密。
(1) 客户端经过TCP三次握手创建到服务器端口443(HTTPS的默认端口)的TCP链接
(2) 客户端经过SSL握手创建安全层
(3) 客户端发送http报文到SSL安全层,安全层将报文加密后发给TCP --> IP --> ...
(4) 同理服务器发送响应,客户端接收后经过SSL安全层解密发给应用层
(5) SSL安全层关闭通知
(6) TCP关闭链接
从上面的描述能够清晰的看到咱们的报文加密/解密都是在SSL安全层执行。
那么安全层是怎么加密的?密钥又是怎么约定的?这一切的一切都得仔细聊聊第(2)步骤。
(1) 客户端向服务器发送可供选择的加密算法并请求证书。
客户端说:“嘿,小子。我这里有一堆我支持的加密算法,你选一个你喜欢的发给我。对了,顺便把你的身份证复印件发给我看看,我怕我链接的服务器是伪造的。”
(2) 服务器发送选中的加密算法和证书
服务器说:“emmm...我看加密算法A挺好的,咱俩就用这个吧。证书也发给你,证实我不是坏人。”
(3) 客户端保存服务器选择的加密算法和秘钥A以做为往后加密,将A用服务器的公钥B加密后发给服务器,服务器用本身的秘钥C解密后获得A,今后客户端和服务器都用约定的加密算法以及秘钥A进行对称加密。
(看到了伐?先用非对称加密在网络中传输对称加密的秘钥A,以后对报文都是采用对称加密啦。)
(4) 客户端和服务器互相告知,开始加密过程。
在SSL握手以后咱们就能够开开心心的发送和接收加密报文啦。
以上是HTTPS加密的全过程,不过还不足以构成完整的HTTPS,由于完整的HTTPS要保障两个方面的安全:报文安全、身份安全,加密只能保证报文是安全的,不能保证身份是正确的。
试想,A和B互相写信而且交换盒子钥匙,而后将信放盒子里寄出去,上面的加密行为可让A和B之间写的信内容不会被他人获取,可是若是一开始和A通讯的就不是B呢?是窃取者C假装成B和A通讯,那么A会和C在SSL的时候就交流钥匙而后C能够窃取A写给B的信的内容。
身份的认证咱们用数字证书。
含有数字证书的报文的结构:
刚刚SSL握手的第(1)步还记得伐?客户端向服务器索要证书,这个证书是服务器能够证实本身身份的东西,该证书里包含了服务器的一些基本信息,好比站点的DNS主机名、该站点组织名、站点的公钥(发公钥就是为了让客户端SSL方便执行握手(3))等,以及证书的序列号、证书签名算法、过时日期等证书信息。
证书是一个站点的身份证,可是身份证也能够被伪造,为了保证这个证书是真的咱们须要数字签名。咱们会将证书内容用签名算法生成一个值,咱们称之为“摘要”。而后将该摘要用主机的私钥加密,加密后的内容就是咱们的数字签名。
若是公钥解密后获得的摘要与生成的摘要不符那么可能有两种状况
数字证书和加密就构成了一个完整的HTTPS事务。
参考书籍:
《HTTP权威指南》