@1234567890
2018-08-03T06:58:47.000000Z
字数 2187
阅读 1136
支付
最近在做支付渠道的代码重构。这次要讲的不是代码重构,而是讲加密。现在有好多的第三方支付服务,支付服务是一个高安全的行为。在数据传输过程中都需要加密,不同的支付服务,加密方式也不一样。主要是通过对称加密、非对称加密、对称与非对称组合加密。还有就是数据的签名。下面就讲讲我对这些加密的理解
有流式、分组两种,加密和解密都是使用的同一个密钥
DES是一个分组加密算法,他以64位为分组对数据加密。同时DES也是一个对称算法:加密和解密用的是同一个算法。它的密匙长度是56位(因为每个第8位都用作奇偶校验),密匙可以是任意的56位的数,而且可以任意时候改变。DES现在已经不视为一种安全的加密算法,因为它使用的56位秘钥过短,以现代计算能力,24小时内即可能被破解,该标准在最近已经被高级加密标准(AES)所取代
特点
分组比较短、密钥太短、密码生命周期短、运算速度较慢
高级加密标准(Advanced Encryption Standard,AES),AES的区块长度固定为128 位元,密钥长度则可以是128,192或256位元。这个标准用来替代原先的DES
加密使用的密钥和解密使用的密钥是不相同的,分别称为:公钥、私钥,公钥和算法都是公开的,私钥是保密的。非对称加密算法性能较低,但是安全性超强,由于其加密特性,非对称加密算法能加密的数据长度也是有限的
RSA加密算法是一种非对称加密算法。在公钥加密标准和电子商业中RSA被广泛使用
将任意长度的信息转换为较短的固定长度的值,通常其长度要比信息小得多,且算法不可逆。用于计算出一段不可逆向计算的数值,以此来验证该文件是否被修改的.
MD5是输入不定长度信息,输出固定长度128-bits的算法。经过程序流程,生成四个32位数据,最后联合起来成为一个128-bits散列。基本方式为,求余、取余、调整长度、与链接变量进行循环运算。得出结果
与MD5相似,主要用作签名
区别
1、在于生成的数据长度为256-bits,即64位数据。
2、在加密过程中需要有个密钥。
3、运算速度比MD5
//1、参数签名
params=params+"&key="+ key;
String sign= MD5Util.MD5Encode(params, "UTF-8");
//2、参数转xml,Https请求微信预支付
//1、参数签名
String sign = SignUtils.sign(paramMap, SHA_256_SIGN, signKey, DEFAULT_CHARSET_STRING);
//2、数据加密
String res = EncryptUtil.signEnvelop(paramMap, config.getKeyStorePassword(), config.getPriKey(),config.getPubKey());
//3、Https请求京东支付服务
//1、对业务数据加密
String encryptStr = AESCoder.encrypt(JSON.toJSONString(bizData), getXFConfig().getRsaKey());
//2、对请求参数,进行签名
String sign = UcfForOnline.createSign(config.getRsaKey(), "sign", requestMap, RSA_ENCRYPT);
//3、Https请求先锋支付服务
HttpConfig httpConfig = new HttpConfig();
httpConfig.param(requestMap).url(config.getSigleAgencyPayUrl()).timeOut(9000);
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对称加密性能比较好一点