网络基础 -- https加密通讯
参考贴:https://blog.csdn.net/junehappylove/article/details/52288796
https与http相比它的通讯是加密的安全的
服务器和客户端之间的信息传递需要做加密处理
这里我们要明确另一些概念
对称加密:加密和解密使用同一把钥匙,这个时候需要保存好这个密钥。
非对称加密:加密和解密是使用不同的密钥的,也就是非对称加密系统,通常一个密钥是公开的,大家都知道的,一个密钥是私有的,需要妥善的保存避免泄露,这样一方用公钥或者私钥进行加密,另一方用相反的钥匙做解密。
那么情景一:
服务器作为主体时,服务器拥有私钥,向客户端推送数据时,服务器用私钥做了加密,将加密后的数据发送给客户端,客户端拿到数据后用公钥做解密就能得到真实的信息了。
客户端通过一个服务器地址向服务器发起请求:
C to S:hello server222
S to C:hello , I’m server
C to S:证明自己是服务器
S to C:我是服务器 {我是服务器}[私钥|RSA]
客户端向服务器发出消息,但是地址这个东西是不可靠的,黑客可以冒充服务器,那么这个时候客户端就需要服务器证明自己的身份,前面说了服务器是会向客户端发布自己的公钥的,这里我们默认客户端已经得到了服务器的公钥(具体得到的方法后续说明),这个时候服务器只要发一段明文“我是服务器”和他对应的被加密之后的密文”我是服务器”(以服务器的密钥加密)给客户端,客户端用公钥解密密文与明文做对比,相同则证明服务器是真的;
这里规定一个加密的格式: {表示加密之后的密文}[加密的钥匙类型|加密的算法]
数字证书
这里我们默认客户端已有服务器的公钥,但实际上公钥到底是怎么得到的呢
方法一:一开始的时候客户端就管服务器去要公钥,那样的话黑客也能通过模仿服务器将自己的公钥发给客户端,之后就能通过身份认证了
方法二:服务器们统一将公钥放到网站上,让客户端自己去取,但这种情况下黑客同样可以去模拟这个保存公钥的网站
所以这两种方法都是不可取的,为了解决这个问题数字证书就出现了,大体上说数字证书就是由一帮权威机构为服务器制作的一个身份证,这个证书里面的大概内容:
所有者,也就是证书是哪个服务器的
公钥
有效期
各种算法
这里只简单列出最重要的属性,那么现在当我们拿到一个证书时,只要该证书能证明自己是合法的(具体证明过程不做讨论,是那些颁发机构做的事)我们可以确定的信息就是该证书是哪个服务器所有的以及他对应的公钥
既然我们能通过数字证书的方式得到服务器正确的公钥了,那通讯的过程演变为了:
情景二:
C to S:hello server
S to C:hello , 这是我的数字证书(这时客户端通过数字证书确认了服务器和公钥)
C to S:证明自己是服务器
S to C:我是服务器 {我是服务器}[私钥|RSA]
C to S:我的余额 {我的余额}[公钥|RSA]
S to C:你的余额为100 {你的余额为100}[私钥|RSA]
这个时候如果是黑客冒充的服务器,那他最多是冒充了服务器的地址然后盗用了服务器的证书,但是黑客无法改写证书也没有服务器的私钥,是没法通过身份认证的
到了这一步我们的客户端已经确认和真实的服务器建立的连接,但是后续的问题来了,以后客户端向服务器发送信息说要查看自己的余额时只要用公钥加密就行了,因为密钥只有服务器才有,所以这个信息只有服务器能够解读,但是问题出现在服务器回答说你的余额为100时,如果再用RSA的方式进行加密的话,这个信息是所有人都能解读的,因为公钥是公开发布的。
这个时候,当客户端确认了服务器的真实性后,要在本地生成一个对称加密算法和密钥,然后将这两个东西用公钥加密发送给服务器,服务器得到对称加密算法和密钥后,后续的通话都将通过这个临时生成的对称算法和密钥来进行加密;
情景三:
C to S:hello server
S to C:hello , 这是我的数字证书
C to S:证明自己是服务器
S to C:我是服务器 {我是服务器}[私钥|RSA]
C to S: {我的对称算法和密钥}[公钥|RSA]
S to C:{收到算法和密钥,以后通讯使用这个对称算法和密钥进行加密}[密钥|对称算法]
C to S: {我的余额}[密钥|对称算法]
S to C:{你的余额为100}[密钥|对称算法]
现在这个通讯过程已经很接近https的通讯方式了,但仍有一些问题存在,黑客虽然无法破解加密的内容,但他可以故意修改加密内容,导致信息的接收方不能得到正确的信息。
数字签名:
这个时候我们需要依赖数字签名来确保数据在传输过程中没有被人恶意的修改,数字签名工作的原理是:发送方在发送信息之前先去得到信息的hash值,每个数据都有自己对应的hash值,这个值重复的几率趋近与零,所以我们可以认为任意一个数据的hash值都是唯一的,将这个hash值加密后作为数字签名附加到要发送的内容上(这个内容也是要加密的),接收方接收到数据后,先将真正的内容进行解密,然后计算解密后的内容的hash值,再对数字签名进行解密,对比两个hash值,如果不同,说明数据受到了篡改,那么将立即停止通讯。
这里有一个疑问:如果在验证服务器身份的时候,黑客拦截了客户端的验证请求,然后自己也向真正的服务器发起验证请求,然后将服务器给出的证明发给客户端,那是不是就能冒充服务器了
一些应用:git添加密钥 ssh连接的时候询问是否信任接的时候询问是否信任
