所谓对称加密,就是发送方要给接收方在网络上发送一段明文,但是不能直接发。
发送方需要加密,对称加密指的就是加密和解密用的是同一把密钥。
假设发送方准备了一串明文,123456,想要传出去,他先用 密钥A 把123456加密成一个密文,
然后把这个密文通过网络传输给接收方,即使有人在中间截取到这个密文,
由于他不知道加密用的是什么算法,什么密钥,他就办法解密得到明文,
而接收方收到这个密文之后,他知道发送方用的是哪个密钥,所以接收方使用跟发送方用同一把密钥解密就行了
解密出来的明文,他就可以使用了,这就是对称加密。
对称加密它有点不安全。
只要有一方密钥泄露,都会影响完整的通信流程。
发送方因为从头到尾只有一个密钥,只要被截取了,截取的人就可以自由的与发送方通信,包括发送方的数据,截取的人也能自由的进行解码。所以这个是不安全的,在金融领域不能用。
那非对称加密就是加密跟解密使用的密钥不一样,不对称,所以叫非对称加密。
举个例子:还是发送方想要发送一个明文数据,它的这个明文数据呢先用 密钥A 加密成一段不认识的密文。
然后密文经过网络传输到达接收方,到达接收方以后呢,接收方用 密钥B 进行解密,得到明文。
这样,即使有人在传输途中将发送者的密文截取,并且那个人也知道发送方的这个密钥。他也解不出这个密文。
所以这个相对比较安全。
但如果说有一个黑客,如果知道了这个接收方的密钥,那么他就可以进行自由的解密,但是他却不能模拟完整的通信。
完整的通信,就是接收方又要给发送方发数据。
所以为了安全期间,我们单向的第一项流程,我们使用 A、B 两把密钥。
就是发送方,要发送数据的时候,用一把密钥加密,接收方收到以后再拿另外一把密钥来解密。
然后,接收方再给发送方要传数据的时候,就再来造上两把密钥。
接收方拿 密钥C 进行加密,发送方拿 密钥D 来进行解密。
这样相当于另外一项的这个流程,那又是一个安全的。
黑客除非完全知道我们这四把密钥,否则就不能模拟完整的整个通信过程。
所以我们就使用非对称加密来做整个金融级别的数据加密。
还是以这个图为例,
发送方呢要给接收方发送数据,他先拿 密钥A 进行加密。但是 密钥A 不能被别人知道,他需要隐藏起来。
他加密完数据以后,让接收方拿 密钥B 来进行解密。
所以他必须告诉接收方 密钥B 是什么,那这个 密钥B 就应该暴露出来,这个 密钥B 就是我们所说的公钥
暴露出给别人用的就叫公钥,我们自己藏起来的就叫私钥。
当然这个公钥和私钥是一个相对概念,你也可以把这个 密钥B 藏起来,那 密钥B 就是私钥,密钥A 就是公钥。
所以对于第一个单项流程,密钥B 呢就是我们的公钥,他要暴露给接收方使用。
第二个流程呢,接收方又要给发送方发数据
接收方藏一把密钥叫 密钥C,也就是私钥,发送方想要接收到这个密文来进行解密,他就得用另外一把密钥叫 密钥D,
此时接收方就得告诉发送方,要用哪把密钥才能解密接收方发的密文数据。
这样的话,接收方暴露的这把 密钥D 就被称为公钥。
在我们使用支付宝期间,也同样有四把密钥
分别是商户自己藏一把,这个叫商户私钥。
商户的加密数据要传给支付宝,让支付宝解密,那就得告诉支付宝商户的公钥是什么
RSA 算法,其实会生成一对密钥,一个A、一个B,这个 A、B随便藏一个,另外一个暴露给别人,别人就可以用来进行解密。
所以们商户现在自己商户私钥、给支付宝一把商户公钥
支付宝也一样,它自己藏一把支付宝私钥,给商户一把支付宝公钥
接下商户比如想要支付一个订单,本来我们可以把这个订单进行一个加密,加密成一串不认识的字符直接传过去,支付宝再进行解密。
但是我们觉得这样太麻烦了,支付宝还要解密。
包括我们加密的这串密文,如果别人一直能到拿这串密文,把这串密文截取来了,别人直接把这个密文发出去,相当于伪造这个数据。
那这个可能也有点不安全。
所以我们现在做了一个签名,这就类似于我们签了一个协议,每个人都要按照他的指纹,那协议里的数据只要改一下。
上面的这个指纹就必须发生变化,
假设这个指纹是 MD5,只要协议内容有变化,这个指纹就必须变。
相当于这个协议的明文跟这个这个签名其实是一套的。任何一个变了都不行。
所以商户在传的时候。为了支付宝使用方便,把明文传给支付宝,但是在明文后边,他用私钥再给你加一个签名
最后将这个明文和这个签名全部传出去出去,把他们作为一个整体数据在网络间传输。
别人即使拦截到这个数据,比如你想支付一百,黑客恶意破坏,让你支付一万,他给明文后边加了四个零
如果他改了,那传给支付宝,支付宝收到这一串数据,里面有一个签名,有一个明文数据,明文数据他直接拿来用,相当于他要支付多少钱。
然后,这个签名他呢就要用公钥验证一下明文跟签名是不是同一个东西,
他一验证,只要这个明文稍微一个字节发生变化,签名就不一样。
所以网络之间现在这个数据就没法篡改,所以。
我们相当于使用公钥来做了一个验证签名。
支付宝验证完了以后,觉得这是对的。然后进行支付。支付完了以后呢,
假设支付成功了,支付宝接下来就得告诉我们这个商户成不成功。
比如支付宝有一个信息叫success=true&treadeNode=1
,告诉你支付成功,以及此次的交易流水。
接下来支付宝就得把支付成功的这个消息或各种消息,发送出去,同样支付宝先用他自己的私钥,生成这条明文数据的一个签名。
这个签名生成签名的过程,我们称为加签,相当于按指纹的过程。
接下来把整个数据再传输给商户。
商户收到完整的数据,为了验证这条数据是支付宝发过来的,他会用支付宝给他的公钥,来验证此条数据。
这个验证的过程就叫验签。如果验证正确了,那商户就认为这条发回来的数据是可信的。
假设我们模拟黑客的流程,我们现在明明支付成功了,然后呢我们这个支付宝给我们传递的是成功数据。
网络间有一个节点拦截到了我们这个支付宝数据,他把明文的successors 改成false,相当于告诉商户支付失败了,命令其再次支付。
所以呢商户收到一看,支付失败了,还需要再支付吗?
实际上是支付成功了,如果不验签,商户光看明文,一看失败了,可能会再次支付,
但是如果验证了 签名,支付宝原来的明文是true,做的明文是这样,如果改成false,肯定就是另外一段签名,所以签名验证不通过,商户就会认为这个不是支付宝传回来的数据。可能是网络之间进行了一些篡改的数据。
所以整个验签过程在任何一方都非常必要。
首先看一下京东,现在全世界的人都可以访问到京东,
原因是京东呢有一个域名叫 jd.com
所以如果我们想要按照正规的流程
应该是把我们这个项目写好以后,我们自己买一个服务器。
这个服务器必须有一个东西叫 公网IP,公网IP 呢相当于我们分配到全世界的人都能访问的一个IP,
然后给这个IP 再来绑定一个域名,域名相当于它的别名一样
假设域名gulimall.com
以后呢只要别人访问gulimall.com
,公网上的域名解析器,就知道这个域名对应的是我们的 IP 地址,就能让请求跳转过来,用户就能访问到我们的网站
域名跟电脑绑定,这是正规流程,然后把网站放上去,最终还要去来进行我们整个网站的备案。
它实现的功能也是让所有人可以访问到自己本地的网站
第一种场景。
假设访问京东,肯定是能访问的,具体就是,我们要访问的时候,去 DNS 服务器,查询京东对应的 IP 地址,然后浏览器将请求路由到这个 IP 上。
第二种场景
为什么我们能跟别人互相聊 QQ 呢?
其实是这样的,首先我们既然能聊天,那就说明自己跟别人电脑上肯定都装了一个QQ软件,
我们聊 QQ 的整个消息发送,都是 QQ 这个软件跟 QQ 服务器建立起连接的。
QQ 服务器的 IP 地址是固定的,那我电脑的 QQ 软件也跟服务器是建立起连接的,
所以我们要发消息呢,这个消息先到达QQ服务器,QQ服务器再通过这个链接再转发给别人的电脑
大致是这样一个简化的这个流程。
所以我们目前这种情况就是我们访问外界一定访问得通。但是呢外界想要访问我们访问不通,
除非我们跟外界装了一个互通的软件才可以访问的通。
我们就除了走正规流程外,我们测试期间还可以做内网穿透,
内网穿透,
我们去内网穿透的服务商,下载一个软件。
软件只要一启动。我们的软件跟内网穿透服务商就会建起一个长链接,是永远在的。
然后内网服务穿透的这个服务商还会为我们这个软件临时给一个域名,这个域名呢可能很长是一个随机的域名,这个域名也不需要备案。
因为这个域名呢是服务商的二级或者三级域名。
也就是说服务商比如是 jd.com 或 hello.com,他绑定一个域名备好案以后,他下边的这些二三级域名无论多少级。
无论生成多少个域名都是无需备案的。
所以他为我们临时分配一个域名,分配好域名以后,别人想要访问我们,使用 haha.hello.com 来访问我们,
因为 haha.hello.com 属于 hello.com 旗下,所以别人会先 ping 通 hello.com。知道他的 IP 地址,
所以别人访问我们的一切请求,先会到达内网穿透的服务商,然后内网穿透服务商一看是访问 haha.hello.com
发现这个域名是之前分配给我们的域名,所以,他将所有的请求相当于透过这个传输通道,然后直接传给我们的电脑,那就实现了别人能访问我们电脑,
比如我们电脑里边,我们部署了我们商城网站,别人通过这个域名能直接访问到我们电脑的商城网站,这样我们在测试期间那就比较好用了。
1、开发测试(微信、支付宝)
2、智慧互联
3、远程控制
4、私有云
1、natapp:https://natapp.cn/ 优惠码:022B93FD(9 折)[仅限第一次使用]
2、哲西云:www.zhexi.tech 优惠码:SBQMEA(95 折)[仅限第一次使用]
3、花生壳:https://www.oray.com/
示例项目
示例代码
示例代码
示例代码