支付接口教程特别篇——公钥与私钥,双钥加密和数字签名

不知道有没有高考志愿报了电子商务专业的同学,不出意外的话你们以后有门课就是电子支付原理。
小编总结了一些私钥与公钥的知识,不一定完全正确,但至少可以帮助人们理解。
我们将以提问的方式循序渐进(其实也是我的心路历程),让我们开始。

什么是公钥与私钥?

总的来说,是一种采用RSA算法对网络数据进行加密传输的方式。采用这种方式加密,需要生成两串秘钥,公开的叫做公钥,未公开的称为私钥。它们都可以用于加密和解密文件。

什么是RSA算法?

RSA算法一直是使用范围最广的"非对称加密算法",早在1977年就已经诞生。具体的原理并不难,但不是我们今天讨论的重点。
只需要记住使用这种算法,加密和解密的时候所使用的密码不一样,但密码永远是成对出现的。
也就是说,一个箱子配备了两把钥匙,你用其中一把钥匙把箱子锁住,再用这把钥匙是打不开的,需要用另一把,反之亦然。

公钥和私钥到底哪个用来加密,哪个用来解密?

公钥和私钥是同时存在的一对秘钥,在本质上没有区别。
例如,A秘钥加密的文件可以用B秘钥解密(AB秘钥必须为一对),B秘钥加密的文件可以用A秘钥解密(不能自己解密自己)。只不过人人都知道的叫做公钥,只有一个人知道的叫做私钥。
所以,公钥和私钥只是人为赋予的名称,和哪个加密,哪个解密并没有直接的关系
之所以会存在这个问题,原因是使用的场景不同,我们先直观的看看这两种情况:

  1. 你有两个字母A和B,你用A加密了一个文件,此时只有B可以解密,然后你告诉所有人,这里有一个我用A加密过的文件。虽然人人都可以复制一份加密文件到自己的电脑上,但是他们并不知道B可以解密。然后你想把这个文件交给我,所以告诉我字母B可以解密,此时我也去复制了一份文件,并且用字母B进行解密,我也就看到了文件的内容。这样就达到了保护数据的目的,此时公钥用于加密,私钥用于解密

  2. 我有A、B两个字母,一开始就通知了所有人,想和我说话的同学请用字母B进行加密。这个时候你把用字母B加密过的文件公开了出来,并注明我来查收。但是,总有那么些坏人会查收一些不是留给自己文件,但是坏人拿到的是加密过的文件,而且并不知道A可以用来解密。所以只有当我拿到文件时,用A进行解密可以知道内容。也达到了保护数据的目的,此时仍然是公钥用于加密,私钥用于解密

上面两种情况都是公钥加密的情况,比较容易理解。那么我们想一下,如果用私钥加密,那么就意味着所有人都能解密我发出的信息,这种情况有什么用呢?答案就是数字签名

  1. 我现在使用字母A加密了我的文件(A并不会公开),然后我告诉所有人请用字母B来解密,现在大家都知道了我发的内容。但是,如果有人想伪造的文件呢。此时,如果你用B解密了密文,那么你自然会想到,这个文件肯定是由我发出的,因为能用字母B解密的文件肯定是字母A所加密的,而只有我才知道字母A。这样就达到了确认文件来源的目的。

  2. 我收到了一句话,内容是让我立即关闭电脑,还附带了一个数字签名,但是我认为只有我老婆才能让我关掉电脑。这个时候我去问她“你加密文件的公钥是什么”,她生气的告诉我是字母B(她的公钥),然后我用字母B去解密数字签名,解密出的内容是一句英语“Turn off computer”。我用百度已翻译发现是让我关闭电脑的意思。我明白了两个问题:第一,我能够解密数字签名,说明这句话确实是她发送给我的。第二,解密出来的内容和我收到的那句话意思是一样的,代表这句话并没有被人篡改过。那么此时,我欣然的关闭了我的电脑。

其实,第四个场景才是支付接口集成常遇到的情况,前面几个只是帮助理解双钥加密的原理罢了。当然,实际的数字签名要比这些文字复杂的多,比如说双人双钥的情况。

为什么有些支付接口要采用双钥加密?

目的无非就是两个:保证信息来源可靠性,和保证信息完整性
这两点在支付流程中是及其重要的,毕竟涉及到钱的东西,谁都不敢含糊。双钥加密目前并没有组织声称可以破解,所以能够最大限度的保障支付数据的安全。
比如,后面要介绍支付宝APP支付和银联支付就是双钥加密的。

为什么有的接口又不用呢?

实际上之前介绍的接口采用的是对称加密的算法,即加密与解密使用同样的秘钥。
虽然认为对称加密不如非对称加密安全,但是也没有任何迹象表面对称加密会被淘汰,而且对称加密更简单易用。
其实,对称加密最大的风险就在于秘钥管理。这就是为什么我们之前介绍的微信支付,在收集秘钥的时候,总是多次验证,而且秘钥只给你看一眼。


以上内容属于作者原创,特此声明,如需转载,请留言取得同意

上一篇:PHP 变量转换情况汇总


下一篇:Apache配置多个站点(虚拟主机)最简单的办法