[关闭]
@1234567890 2018-08-03T06:58:47.000000Z 字数 2187 阅读 1136

支付渠道加密

支付


最近在做支付渠道的代码重构。这次要讲的不是代码重构,而是讲加密。现在有好多的第三方支付服务,支付服务是一个高安全的行为。在数据传输过程中都需要加密,不同的支付服务,加密方式也不一样。主要是通过对称加密、非对称加密、对称与非对称组合加密。还有就是数据的签名。下面就讲讲我对这些加密的理解

对称加密

有流式、分组两种,加密和解密都是使用的同一个密钥

DES

DES是一个分组加密算法,他以64位为分组对数据加密。同时DES也是一个对称算法:加密和解密用的是同一个算法。它的密匙长度是56位(因为每个第8位都用作奇偶校验),密匙可以是任意的56位的数,而且可以任意时候改变。DES现在已经不视为一种安全的加密算法,因为它使用的56位秘钥过短,以现代计算能力,24小时内即可能被破解,该标准在最近已经被高级加密标准(AES)所取代

特点
分组比较短、密钥太短、密码生命周期短、运算速度较慢

AES

高级加密标准(Advanced Encryption Standard,AES),AES的区块长度固定为128 位元,密钥长度则可以是128,192或256位元。这个标准用来替代原先的DES

非对称加密

加密使用的密钥和解密使用的密钥是不相同的,分别称为:公钥、私钥,公钥和算法都是公开的,私钥是保密的。非对称加密算法性能较低,但是安全性超强,由于其加密特性,非对称加密算法能加密的数据长度也是有限的

RSA

RSA加密算法是一种非对称加密算法。在公钥加密标准和电子商业中RSA被广泛使用

签名

将任意长度的信息转换为较短的固定长度的值,通常其长度要比信息小得多,且算法不可逆。用于计算出一段不可逆向计算的数值,以此来验证该文件是否被修改的.

MD5

MD5是输入不定长度信息,输出固定长度128-bits的算法。经过程序流程,生成四个32位数据,最后联合起来成为一个128-bits散列。基本方式为,求余、取余、调整长度、与链接变量进行循环运算。得出结果

SHA-256

与MD5相似,主要用作签名
区别
1、在于生成的数据长度为256-bits,即64位数据。
2、在加密过程中需要有个密钥。
3、运算速度比MD5

各个支付渠道对加密方式

微信支付

  1. //1、参数签名
  2. params=params+"&key="+ key;
  3. String sign= MD5Util.MD5Encode(params, "UTF-8");
  4. //2、参数转xml,Https请求微信预支付

京东支付

  1. //1、参数签名
  2. String sign = SignUtils.sign(paramMap, SHA_256_SIGN, signKey, DEFAULT_CHARSET_STRING);
  3. //2、数据加密
  4. String res = EncryptUtil.signEnvelop(paramMap, config.getKeyStorePassword(), config.getPriKey(),config.getPubKey());
  5. //3、Https请求京东支付服务

先锋支付

  1. //1、对业务数据加密
  2. String encryptStr = AESCoder.encrypt(JSON.toJSONString(bizData), getXFConfig().getRsaKey());
  3. //2、对请求参数,进行签名
  4. String sign = UcfForOnline.createSign(config.getRsaKey(), "sign", requestMap, RSA_ENCRYPT);
  5. //3、Https请求先锋支付服务
  6. HttpConfig httpConfig = new HttpConfig();
  7. httpConfig.param(requestMap).url(config.getSigleAgencyPayUrl()).timeOut(9000);
  8. HttpClientUtil.post(httpConfig);

总结

签名

签名主要用于验证,参数在传递过程中是否被串改。

签名对比
微信预支付在参数中加入一个key(在商户平台设置的密钥),然后进行MD5加密。签名数据长度为32位

京东支付使用SHA-256的签名方式,和微信签名类似.signKey(在商户平台设置的密钥)。签名长度为64位

先锋支付使用RSA对称加密的方式,用公钥加密。签名长度随参数的增加而增加,但是用了BASE64,将长度固定

签名经验总结
以后在签名时应该使用SHA-256。
1、与MD5相比,有个密钥加入签名,SHA-256比较安全
2、与RSA相比,比较消耗性能,SHA-256比较好

PS:签名时,需要先对数据进行排序。

数据加密

加密对比
微信预支付没做数据加密,用xml传输

京东支付用RSA非对称加密

先锋支付用AES对称加密

疑问?
1、微信预支付为什么不对数据加密?why?why?why?

2、京东支付为什么加密时需要传KeyStorePassword,PriKey,PubKey,我的理解中非对称加密只要公钥加密就行。KeyStorePassword应该是对PriKey的解密。求大佬告知--

3、先锋支付为什么用AES,RAS不是更安全吗?(这个其实没什么,不同的支付公司,加密方式不同)

4、使用了Https,数据传输为什么还要加密

加密经验总结
数据使用RSA非对称加密比较安全,AES对称加密性能比较好一点

HTTPS

https干货

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注