文章目录
- https原理
- 为什么要加密
- 常见的加密方式
- 对称加密
- 非对称加密
- 数据摘要&&数据指纹
- 数据签名
- https的几种工作方案
- 方案一:只使用对称加密
- 方案二:只使用非对称加密
- 方案三:两端都使用非对称加密
- 方案四:非对称加密 + 对称加密
- 针对上述情况的中间人攻击
- 证书
- CA认证
- 理解数据签名
- 方案5:非对称加密+对称加密+证书
- 总流程
https原理
由于http协议内容都是按照文本方式明文传输的,这就会导致在传输过程中出现⼀些不安全的情况。
https也是⼀个应用层协,是在http协议的基础上引入了⼀个加密层
如果单纯的使用http协议,那么数据在网络传送中就以明文形式传送。如果http发送请求时,先经过 ssl/tls 的加密后再去传送,对方主机收到后再经过 ssl/tls 解密的过程就是https
https就相当于主机之间在应用层是明文的,但是在其他层是属于密文的
可以通过端口号来决定数据是否加密,例如80是http,443是https
为什么要加密
因为http的内容是明⽂传输的,明⽂数据会经过路由器、wifi热点、通信服务运营商、代理服务器等多个物理节点,如果信息在传输过程中被劫持,传输的内容就完全暴露了。劫持者还可以篡改传输的信息且不被双方察觉,这就是中间⼈攻击 ,所以才需要对信息进行加密
常见的加密方式
对称加密
采⽤单钥密码系统的加密方法,同⼀个密钥可以同时用作信息的加密和解密,这种加密方法称为对称加密,也称为单密钥加密。
特征:加密和解密所用的密钥是相同的 ,算法公开,计算量小,速度快,效率高
非对称加密
需要两个密钥来进⾏加密和解密,这两个密钥是公开密钥(publickey,简称公钥)和私有密钥(privatekey,简称私钥)
公钥可以加密也可以用来解私钥加密的密文,私钥可以加密也可以用来解公钥加密的密文
因此公钥和私钥是配对的,缺点是运算速度非常慢
数据摘要&&数据指纹
数据摘要也就是数据指纹,用来确定数据的唯一性
其原理是**利用单向散列函数(Hash函数)对信息进行运算,⽣成⼀串固定长度的数字摘要。数字指纹并不是⼀种加密机制,但可以用来判断数据有没有被窜改 **
和加密算法的区别是,摘要严格意义不是加密,是没有解密的,只不过从摘要很难反推原信息,通常用来进行数据对比
数据签名
对数据摘要再进行加密,就得到数字签名
https的几种工作方案
方案一:只使用对称加密
客户端和服务端都是使用同一个密钥进行加密解密,引⼊对称加密之后,即使数据被截获,由于中间人不知道密钥是啥,因此就无法进行解密,也就不知道请求的真实内容了。
但是这种做法并不安全,因为服务器同⼀时刻其实是给很多客⼾端提供服务的,如果是相同密钥那就及其容易扩散,中间人也容易获取到。如果是每个客户端用的密钥都不一样,那服务器就需要维护每个客户端和每个密钥之间的关系,那这样的维护成本太大
比较理想的做法,就是能在客户端和服务器建立连接的时候,双方协商确定这次的密钥是什么,但是还有问题是因为密钥也要经过传输,但是如果密钥直接明文传输,中间人也很容易获取到,所以密钥进行加密,但是密钥加密的密钥也是如此。因为直接使用对称加密这种做法并不安全
方案二:只使用非对称加密
首先客户端向服务端申请公钥,服务端返回公钥给客户端,客户端使用公钥进行加密后传输,服务端接收到数据后用私钥解密处理数据后再用私钥加密返回。因为公钥和私钥是配对使用的,所以用公钥加密的数据必须得用私钥解密,私钥加密同理。
这种做法看似合理,实际上如果中间人在一开始客户端申请公钥使就已经开始劫持了,那中间人就会获取到公钥并篡改公钥,所以这种做法也不安全
方案三:两端都使用非对称加密
- 服务端拥有自己的公钥S与对应的私钥S’,客户端拥有自己公钥C与对应的私钥C’
- 客户端和服务端交换公钥
- 客户端给服务端发信息:先用S对数据加密,再发送,只能由服务器解密,因为只有服务器有私钥S’
- 服务端给客⼾端发信息:先用C对数据加密,在发送,只能由客户端解密,因为只有客户端有私钥C’
这种做法看似可以,实际上这种做法的效率非常低,并且和方案二一样中间人可以在两端交换公钥的时候就进行劫持并篡改,也并不安全
方案四:非对称加密 + 对称加密
因为非对称加密的效率很低,所以可以配合对称加密使用
- 服务端具有非对称公钥S和私钥S’
- 客户端发起https请求,获取服务端公钥S
- 客户端在本地生成对称密钥C,通过公钥S加密,发送给服务器.
- 由于中间的网络设备没有私钥,即使截获了数据,也无法还原出内部的原文,也就无法获取到对称密钥
- 服务器通过私钥S’解密,还原出客⼾端发送的对称密钥C.并且使用这个对称密钥加密给客户端返回的响应数据.
- 后续客户端和服务器的通信都只用对称加密即可。由于该密钥只有客⼾端和服务器两个主机知道,其他设备不知道密钥即使截获数据也没有意义
也就是说这种做法是利用对称加密的密钥来给非对称加密的公钥进行加密传输,这样除了一开始是使用非对称加密外后面都是使用对称加密进行加密的。但是这种做法也不安全
还是一样的道理,如果中间人一开始就劫持了公钥那后面再怎么传输都离不开中间人的角色了
针对上述情况的中间人攻击
上述的方案二 三 四都是出现在了一个问题上,那就是如果一开始中间人就获取到了公钥。
一旦中间人获取到了就可以:
- 服务器具有非对称加密算法的公钥S,私钥S’
- 中间⼈具有非对称加密算法的公钥M,私钥M’
- 客户端向服务器发起请求,服务器明文传送公钥S给客户端
- 中间人劫持数据报文,提取公钥S并保存好,然后将被劫持报文中的公钥S替换成为自己的公钥M,并将伪造报文发给客⼾端
- 客户端收到报文,提取公钥M(自己当然不知道公钥被更换过了),自己形成对称秘钥X,用公钥M加密X,形成报文发送给服务器
- 中间人劫持后,直接用自己的私钥M’进性解密,得到通信秘钥X,再用曾经保存的服务端公钥S加密后,将报文推送给服务器
- 服务器拿到报文,用自己的私钥S’解密,得到通信秘钥X
- 双方开始采用X进行对称加密,进行通信。但是⼀切都在中间人的掌握中,劫持数据,进性窃甚至修改,都是可以的
因此为了解决这种情况就要引入证书
证书
CA认证
服务端在使用HTTPS前,需要向CA机构申领⼀份数字证书,数字证书里含有证书申请者信息、公钥信息等。服务器把证书传输给浏览器,浏览器从证书里获取公钥就行了,证书就如身份证,证明服务端公钥的权威性
一个证书里面包含了:数据的签名和明文信息。其中明文信息里包含了:证书发布机构,证书有效期,公钥等
需要注意的是:**申请证书的时候,需要在特定平台⽣成查,会同时⽣成⼀对⼉密钥对⼉,即公钥和私钥。这对密钥对⼉就是⽤来在⽹络通信中进行明文加密以及数字签名的 **
https://myssl.com/csr_create.html
理解数据签名
签名的形成是基于非对称加密算法的
- CA机构拥有非对称加密的私钥A和公钥A’
- CA机构对服务端申请的证书明文数据进行hash,形成数据摘要
- 然后对数据摘要用CA私钥A’加密,得到数字签名S
服务端申请的证书明文和数字签名S共同组成了数字证书,这样⼀份数字证书就可以颁发给服务端了
方案5:非对称加密+对称加密+证书
在客户端和服务器刚⼀建立连接的时候,服务器给客户端返回⼀个证书,证书包含了之前服务端的公钥,也包含了网站的身份信息
每次的通信传输都需要进行证书认证:
- 判定证书的有效期是否过期
- 判定证书的发布机构是否受信任(操作系统中已内置的受信任的证书发布机构)
- **验证证书是否被篡改:从系统中拿到该证书发布机构的公钥,对签名解密,得到⼀个hash值(称为数据摘要),设为hash1.然后计算整个证书的hash值,设为hash2.对比hash1和hash2是否相等.如果相等,则说明证书是没有被篡改过的 **
假设中间人获取到了证书:
- 中间人篡改了证书的明文
- 由于他没有CA机构的私钥,所以无法hash之后用私钥加密形成签名,那么也就没法办法对篡改后的证书形成匹配的签名
- 如果强行篡改,客户端收到该证书后会发现明文和签名解密后的值不⼀致,则说明证书已被篡改,证书不可信,从而终止向服务器传输信息,防止信息泄露给中间人
那如果中间人掉包了证书呢:
- 因为中间人没有CA私钥,所以⽆法制作假的证书
- 所以中间人只能向CA申请真证书,然后用自己申请的证书进行掉包
- 这个确实能做到证书的整体掉包,但是别忘记,证书明文中包含了域名等服务端认证信息,如果整体掉包,客户端依旧能够识别出来。
- 永远记住:中间人没有CA私钥,所以对任何证书都无法进行合法修改,包括自己的
因此这种方法是可取的。