之前把支付渠道的代码重构,这样新接入支付渠道时要修改的地方集中和统一。不过这次要讲的不是代码重构,而是讲加密。现在有好多的第三方支付服务,支付服务是一个高安全的行为。在数据传输过程中都需要加密,不同的支付服务,加密方式也不一样。主要是通过对称加密、非对称加密、对称与非对称组合加密。还有就是数据的签名。下面就讲讲我对这些加密的理解
对称加密
对消息的加密和解密都是使用的同一个密钥的加密算法。常用的对称加密算法有:DES、3DES、AES等。现在使用最多的是AES
AES
AES是一种分组加密,即将明文分成N个分组,然后对每个分组进行加密。AES的密钥长度则可以是128,192或256比特。
AES 算法本身操作的都是 byte 字节数组,因此,加密后一般会使用 BASE64 编码将 byte 数组转为字符串,而解密之前则先用 BASE64 解码将字符串转回 byte 数组。这里注意下,不是所有的转换都是BASE64编码,也有转化成16进制,我在对接第三方支付时,他们没提供Demo,只是说了下AES加密。在联调时,一直报出解密失败。最后的原因是他们用十六进制,而我这边使用BASE64(满满的坑啊)
DES
DES是也是一个分组加密算法,他以64位为分组对数据加密。不过因为它使用的56位秘钥过短,以现代计算能力,24小时内即可能被破解。所以一般不考虑用这个加密方式了
非对称加密
加密使用的密钥和解密使用的密钥是不相同的,分别称为:公钥、私钥。公钥是公开的,而私钥是保密的。相比对称加密安全性提高了,但牺牲了性能,加解密的速度慢了几个数量级,消息越长,加密和解密的速度越慢
RSA
RSA加密算法是一种非对称加密算法。RSA被广泛使用(我接的第三方支付渠道用对称加密的都是用RSA)
RSA 加密填充方式主要有三种:NoPadding、PKCS1Padding、OAEPPadding。先说下什么是填充。RSA加密时会填充一些随机数。
用PKCS1Padding填充方式,会在明文签名填充11字节的随机数。因此,每一次对明文加密产生的密文都会不一样
。如果想让每次产生的密文都一样,用NoPadding
- 密钥长度越长越安全
- 密钥长度越长越耗性能
- 明文长度是不能超过密钥长度的
签名
将任意长度的信息转换为较短的固定长度的信息摘要,通常其长度要比信息小得多,且算法不可逆。用于计算出一段不可逆向计算的数值,以此来验证该文件是否被修改的。主要的算法有MD5、SHA
MD5
MD5是输入不定长度信息,输出固定长度128-bits的算法。经过程序流程,生成四个32位数据,最后联合起来成为一个128-bits散列。这个有些问题存在:
1、一些不够复杂的密码难以防范彩虹表(预先用MD5逆运算好的表)
2、相同的密码,产生的MD5码一样。
为了应对以上两个问题,比较好的方案就是 MD5 + salt,也称MD5加盐,即将原密码拼上一串盐值salt之后再进行MD5。盐值salt是一个随机字符串,每个用户的 salt 值一般都是不同的,这样就可以保证不同用户最终 MD5 出来的散列值不一样,而且因为有一串随机字符串,彩虹表也很难发挥作用了
SHA
因为MD5存在上面连个问题,SHA是MD5的升级版。SHA加密时一个固定的密钥作为参数。就是相当于前面将的盐。共享密钥,所以这个密钥需要好好保存。
SHA有一系列如SHA-256、SHA-512等,后面的256、512是生成数据的长度256比特、512比特。
数字签名
指用户用私钥
对原始数据的签名进行加密所得的数据。数字签名定义两种互补的运算:一个用于签名,另一个用于验证。"私钥签名,公钥验证"
签名:发送方先用签名算法对明文签名(签名后的摘要长度短小)。然后利用自己的私钥对形成的签名进行加密,这里加密后的数据就是数字签名。
验证:接受方利用发送方的公钥解密被加密的签名得到结果A,然后对明文也进行签名得到结果B.最后,把A和B作比较。此方式既可以保证发送方的身份正确性,又可以保证数据在传输过程中不会被篡改。
数字信封
数字信封的功能类似于普通信封。普通信封在法律的约束下保证只有收信人才能阅读信的内容;数字信封则采用密码技术保证了只有规定的接收人才能阅读信息的内容。
数字信封中采用了对称加密和非对称加密。信息发送者首先利用随机产生的【对称密码】加密信息(因为非对称加密技术的速度比较慢),再利用接收方的【公钥】加密对称密码,被公钥加密后的对称密钥被称之为数字信封。在传递信息时,信息接收方要解密信息时,必须先用自己的私钥解密数字信封,得到对称密码,才能利用对称密码解密所得到的信息。
数字信封既发挥了对称加密算法速度快、安全性好的优点,又发挥了非对称加密算法密钥管理方便的优点。
总结
如果让我来设计加密和签名的方式,我会用以下的方式:
- 发送者A:
- A准备要传送的数字信息(明文)
- A对明文进行签名,得到一信息摘要。
- A用自己的【私钥(SK)】对信息摘要进行加密得到A的数字签名,并将其附在数字信息上。(数字签名)
- A随机产生一个加密钥(DES密钥),并用此密钥对要发送的信息(明文)进行加密,形成密文。(对称加密)
- A用B的【公钥(PK)】对刚才随机产生的加密密钥进行加密,将加密后的DES密钥连同密文一起传送给B。(数字信封)
- 接收者B:
- B收到A传送过来的密文和加过密的DES密钥,先用自己的私钥(SK)对加密的DES密钥进行解密,得到DES密钥。
- B然后用DES密钥对受到的密文进行解密,得到明文的数字信息,然后将DES密钥抛弃(即DES密钥作废)。
- B用A的公钥(PK)对A的数字签名进行解密,得到信息摘要。
- B用相同的has算法对收到的明文再进行一次hash运算,得到一个新的信息摘要。
- B将收到的信息摘要和新生成的信息摘要进行比较,如果一致,说明收到的信息没有被修改过。
网友评论