接入支付服务你一定要知道的小知识
1.前言
接入过第三方服务的应该都接触过公钥、私钥这类说明,尤其对参数要求验证的服务,比如支付类的服务,这类服务一般都会要求你提供公钥、私钥,然后你的请求参数需要用私钥加密,然后再用公钥解密,这样才能保证你的请求是安全的,不会被别人篡改。
通常对于高保密要求的参数都会有加密要求,这时候,如果你之前不了解加密算法,就很容易被公钥、私钥的使用给绕迷糊了。有时候虽然接口都调通了,但是还是一头雾水,这就通了?(没错就是我)
加密算法在大类上分为对称机密和非对称加密,都用来加密,只不过使用场景、性能、安全性方面有些不同。
2.首先什么是加密呢?
加密就是通过一种方式将一个显而易见的东西变成难以理解的东西。
比如这儿有个字符串“笔蒂I”,这三个字儿要摆在你面前不是一眼就知道了吗。
但是我要给你看这样一串东西呢?你还能一下子知道是什么意思吗?
1 |
|
其实这还是那三个字,只不过是经过加密的密文,只有知道了加密的方法才能还原出来,也就是解密。
加密的过程可能是这样的:
- 首先买一本《计算机网络》的书
- 然后按照逗号分隔,每一个逗号分隔开的表示一个字;
- 比如
157 19 2
,表示第232页,第10行,第5个字。
还有,比如之前有个潮汕的朋友,他打电话的时候对于我们来说就是语音加密了,能听见他的声音,但是说的是什么内容一个字也听不出来。这也可以理解为一种加密,把普通话的发音转换成潮汕方言的发音。
3.对称加密
对称加密中所说的对称是对加密和解密而言的,也就是加密和解密的过程使用相同的密钥。
目前最常用也是最安全的对称加密算法是 AES,AES 还分为 AES-128、AES-192和AES256,后面的数字代表加密密钥的位数,位数越高呢,加密效果也就越好,更加不容易被破解。同时,位数越高,加密和解密过程中的计算量也会越大,内存占用也就更大,消耗的资源更多,需要的时间也就更长。
有利有弊,看你的需求而定。基本上,一般场景下 128位就足够安全了。AES 到目前为止,可以说没有漏洞,而且128位就可以保证不会被暴力破解。而更高位数的可能会用到国家级的保密数据上。
块加密算法就是将需要加密的数据分成一个个的固定长度的分组,比如 128位一组,然后分别用算法对每一组进行加密,如果最后一组不足128位的话,还要用填充算法进行填充,保证达到128位。
常用的分组算法有CTR和GCM,CTR 和 GCM 有并行计算的能力,并且, GCM 还能额外提供对消息完整性、真实性的验证能力。
所以我们在某些地方可能看到 AES-128-GCM、AES-256-CTR 这样的写法,前面表示加密算法,后面代表分组算法。
不足之处
对称加密本身从算法层面来说已经足够安全了,但是在密钥分发方面有些不太容易管理。
因为加解密的密钥相同。我加密的数据想要被别人使用,我就要把密钥告诉要使用的人。知道密钥的人、保存密钥的服务器越多,风险就越大。约束自己容易,约束别人难啊。但凡有一方不小心把密钥泄露就完。
4.非对称加密
由于对称加密的密钥分发问题,非对称加密算法可以完美的解决
很多时候看有关于接口参数加密的指引文档,虽然按照人家提供的 demo 可以正常集成,但是文档上说的公钥、私钥还是搞的很迷糊。
现在就来捋一捋啊,就以第三方服务角度来说。假设我是一个支付服务商,为大家提供支付接口的。
公钥
公钥就是公开的密钥,任何人都可以拿到,用来加密数据的。比如我要给你发一条消息,我就可以用你的公钥加密,然后你用你的私钥解密就可以了。
私钥
私钥是绝密的,我作为一个支付服务商,必须将私钥妥善保存,无论是保存在数据库中还是保存在服务器,都必须保证私钥不对外,只有我自己可以使用。
1 |
|
以上是公钥、私钥的使用过程,这样一看就很明确了。
之所以说是非对称加密,是因为私钥只是用来解密的,用公钥加密过的数据,只有用对应的私钥才能解密出来。所以说,即使有那么多人得到了相同的公钥,也无法获取别人加密过的数据。
最常用的非对称加密算法是 RSA ,RSA 有1024、2048、3072、4096、8129、16384 甚至更多位。目前3072位及以上的密钥长度被认为是安全的,曾经大量使用的2048位 RSA 现在被破解的风险在不断提升,已经不推荐使用了
RSA 算法的性能要比对称加密 AES 算法差1000倍左右,虽然数学原理上不太明白,但是有数学常识就可以知道,使用不同的密钥进行加密和解密,必然要比使用相同密钥的算法复杂很多,由此肯定会带来性能上的开销。
非对称加密适合用于那些对安全性要求更高的场景,例如支付场景、数字证书、数据加密传输等等。