加密

对称加密

image.png

什么是对称加密

所谓对称加密,就是发送方要给接收方在网络上发送一段明文,但是不能直接发。

发送方需要加密,对称加密指的就是加密和解密用的是同一把密钥。

假设发送方准备了一串明文,123456,想要传出去,他先用 密钥A 把123456加密成一个密文,

然后把这个密文通过网络传输给接收方,即使有人在中间截取到这个密文,

由于他不知道加密用的是什么算法,什么密钥,他就办法解密得到明文,

而接收方收到这个密文之后,他知道发送方用的是哪个密钥,所以接收方使用跟发送方用同一把密钥解密就行了

解密出来的明文,他就可以使用了,这就是对称加密。

缺点

对称加密它有点不安全。

只要有一方密钥泄露,都会影响完整的通信流程。

发送方因为从头到尾只有一个密钥,只要被截取了,截取的人就可以自由的与发送方通信,包括发送方的数据,截取的人也能自由的进行解码。所以这个是不安全的,在金融领域不能用。

非对称加密

image.png

什么是非对称加密

那非对称加密就是加密跟解密使用的密钥不一样,不对称,所以叫非对称加密。

非对称加密的流程

举个例子:还是发送方想要发送一个明文数据,它的这个明文数据呢先用 密钥A 加密成一段不认识的密文。

然后密文经过网络传输到达接收方,到达接收方以后呢,接收方用 密钥B 进行解密,得到明文。

这样,即使有人在传输途中将发送者的密文截取,并且那个人也知道发送方的这个密钥。他也解不出这个密文。

所以这个相对比较安全。

但如果说有一个黑客,如果知道了这个接收方的密钥,那么他就可以进行自由的解密,但是他却不能模拟完整的通信。

完整的通信,就是接收方又要给发送方发数据。

所以为了安全期间,我们单向的第一项流程,我们使用 A、B 两把密钥。

就是发送方,要发送数据的时候,用一把密钥加密,接收方收到以后再拿另外一把密钥来解密。

然后,接收方再给发送方要传数据的时候,就再来造上两把密钥。

接收方拿 密钥C 进行加密,发送方拿 密钥D 来进行解密。

这样相当于另外一项的这个流程,那又是一个安全的。

黑客除非完全知道我们这四把密钥,否则就不能模拟完整的整个通信过程。

所以我们就使用非对称加密来做整个金融级别的数据加密。

公钥、私钥

什么是公钥、私钥

image.png

还是以这个图为例,

发送方呢要给接收方发送数据,他先拿 密钥A 进行加密。但是 密钥A 不能被别人知道,他需要隐藏起来。

他加密完数据以后,让接收方拿 密钥B 来进行解密。

所以他必须告诉接收方 密钥B 是什么,那这个 密钥B 就应该暴露出来,这个 密钥B 就是我们所说的公钥

暴露出给别人用的就叫公钥,我们自己藏起来的就叫私钥

当然这个公钥和私钥是一个相对概念,你也可以把这个 密钥B 藏起来,那 密钥B 就是私钥,密钥A 就是公钥

所以对于第一个单项流程,密钥B 呢就是我们的公钥,他要暴露给接收方使用。

第二个流程呢,接收方又要给发送方发数据

接收方藏一把密钥叫 密钥C,也就是私钥,发送方想要接收到这个密文来进行解密,他就得用另外一把密钥叫 密钥D,

此时接收方就得告诉发送方,要用哪把密钥才能解密接收方发的密文数据。

这样的话,接收方暴露的这把 密钥D 就被称为公钥

签名、验签

在我们使用支付宝期间,也同样有四把密钥

分别是商户自己藏一把,这个叫商户私钥。

商户的加密数据要传给支付宝,让支付宝解密,那就得告诉支付宝商户的公钥是什么

RSA 算法,其实会生成一对密钥,一个A、一个B,这个 A、B随便藏一个,另外一个暴露给别人,别人就可以用来进行解密。

所以们商户现在自己商户私钥、给支付宝一把商户公钥

支付宝也一样,它自己藏一把支付宝私钥,给商户一把支付宝公钥

image.png

接下商户比如想要支付一个订单,本来我们可以把这个订单进行一个加密,加密成一串不认识的字符直接传过去,支付宝再进行解密。

但是我们觉得这样太麻烦了,支付宝还要解密。

包括我们加密的这串密文,如果别人一直能到拿这串密文,把这串密文截取来了,别人直接把这个密文发出去,相当于伪造这个数据。

那这个可能也有点不安全。

image.png

所以我们现在做了一个签名,这就类似于我们签了一个协议,每个人都要按照他的指纹,那协议里的数据只要改一下。

上面的这个指纹就必须发生变化,

假设这个指纹是 MD5,只要协议内容有变化,这个指纹就必须变。

相当于这个协议的明文跟这个这个签名其实是一套的。任何一个变了都不行。

image.png

所以商户在传的时候。为了支付宝使用方便,把明文传给支付宝,但是在明文后边,他用私钥再给你加一个签名

最后将这个明文和这个签名全部传出去出去,把他们作为一个整体数据在网络间传输。

image.png

别人即使拦截到这个数据,比如你想支付一百,黑客恶意破坏,让你支付一万,他给明文后边加了四个零

如果他改了,那传给支付宝,支付宝收到这一串数据,里面有一个签名,有一个明文数据,明文数据他直接拿来用,相当于他要支付多少钱。

然后,这个签名他呢就要用公钥验证一下明文跟签名是不是同一个东西,

他一验证,只要这个明文稍微一个字节发生变化,签名就不一样。

所以网络之间现在这个数据就没法篡改,所以。

我们相当于使用公钥来做了一个验证签名。

image.png

支付宝验证完了以后,觉得这是对的。然后进行支付。支付完了以后呢,

假设支付成功了,支付宝接下来就得告诉我们这个商户成不成功。

比如支付宝有一个信息叫success=true&treadeNode=1,告诉你支付成功,以及此次的交易流水。

image.png

接下来支付宝就得把支付成功的这个消息或各种消息,发送出去,同样支付宝先用他自己的私钥,生成这条明文数据的一个签名。

这个签名生成签名的过程,我们称为加签,相当于按指纹的过程。

image.png

接下来把整个数据再传输给商户。

image.png

商户收到完整的数据,为了验证这条数据是支付宝发过来的,他会用支付宝给他的公钥,来验证此条数据。

这个验证的过程就叫验签。如果验证正确了,那商户就认为这条发回来的数据是可信的。

image.png

那为什么要有这个验证的过程?

假设我们模拟黑客的流程,我们现在明明支付成功了,然后呢我们这个支付宝给我们传递的是成功数据。

网络间有一个节点拦截到了我们这个支付宝数据,他把明文的successors 改成false,相当于告诉商户支付失败了,命令其再次支付。

所以呢商户收到一看,支付失败了,还需要再支付吗?

实际上是支付成功了,如果不验签,商户光看明文,一看失败了,可能会再次支付,

但是如果验证了 签名,支付宝原来的明文是true,做的明文是这样,如果改成false,肯定就是另外一段签名,所以签名验证不通过,商户就会认为这个不是支付宝传回来的数据。可能是网络之间进行了一些篡改的数据。

所以整个验签过程在任何一方都非常必要