建设银行对接(二)
对发送的数据进行数据加密
发送数据时需要加密,首先是MD5加密,然后将加密结果按照附录1进行转换,参看“建设银行附录(一)”。
下面是MD5Encoder.java
package cn.ipanel.payment.business.bank.ccb.encryption;
?
import java.security.MessageDigest;
?
/**
?* MD5加密解密工具类<br>
?*
?*
?* 关于MD5的算法请参考RFC1321规范<br>
?* RFC1321给出了Test suite用来检验你的实现是否正确:<br>
?* MD5 ("") =d41d8cd98f00b204e9800998ecf8427e <br>
?* MD5 ("a") = 0cc175b9c0f1b6a831c399e269772661<br>
?* MD5 ("abc") = 900150983cd24fb0d6963f7d28e17f72<br>
?* MD5 ("message digest") =f96b697d7cb7938d525a2f31aaf161d0<br>
?* MD5 ("abcdefghijklmnopqrstuvwxyz") =c3fcd3d76192e4007dfb496cca67e13b
?*
?* @author wangxiaoxue
?*
?* 传入参数:一个字节数组 传出参数:字节数组的 MD5 结果字符串
?*/
public class MD5Encoder {
?
??? /**
??? ?* 对二进制数组进行MD5算法加密,并将加密结果按照建行的协议算法进行转换
??? ?* @param source
??? ?* @return
??? ?*/
??? public static byte[] encode(byte[] source) {
?????? byte[] result = new byte[0];
?
?????? try {
?????????? MessageDigest md = MessageDigest.getInstance("MD5");
?????????? md.update(source);
?
?????????? // MD5 的计算结果是一个 128 位的长整数,用字节表示就是 16 个字节
?????????? result = md.digest();
?
?????? } catch (Exception e) {
?????????? e.printStackTrace();
?????? }
?????? return result;
??? }
?
??? public static void main(String xu[]) { // 计算 "a" 的 MD5
?????? // 代码,应该为:0cc175b9c0f1b6a831c399e269772661
?????? System.out.println(ByteUtil.byteToChar(MD5Encoder.encode("".getBytes())));
??? }
?
}
?
?
?
为了以后项目的扩展性,写了一个基础加密解密类,Encoder.java,代码如下:
还写了一个基础加密类
?
package cn.ipanel.payment.business.bank.ccb.encryption;
?
import java.security.MessageDigest;??
?
import javax.crypto.KeyGenerator;??
import javax.crypto.Mac;??
import javax.crypto.SecretKey;??
import javax.crypto.spec.SecretKeySpec;
?
import sun.misc.BASE64Decoder;??
import sun.misc.BASE64Encoder;??
?
/**
?* 基础加密模块
?* @author wangxiaoxue
?*
?*/
public abstract class Encoder {??
??? public static final String KEY_SHA = "SHA";??
??? public static final String KEY_MD5 = "MD5";??
?
??? /**?
???? * MAC算法可选以下多种算法?
???? *??
???? * <pre>?
???? * HmacMD5??
???? * HmacSHA1??
???? * HmacSHA256??
???? * HmacSHA384??
???? * HmacSHA512?
???? * </pre>?
???? */?
??? public static final String KEY_MAC = "HmacMD5";??
?
??? /**?
???? * BASE64解密?
???? *??
???? * @param key?
???? * @return?
???? * @throws Exception?
???? */?
??? public static byte[] decryptBASE64(String key) throws Exception {??
??????? return (new BASE64Decoder()).decodeBuffer(key);??
??? }??
?
??? /**?
???? * BASE64加密?
???? *??
???? * @param key?
???? * @return?
???? * @throws Exception?
???? */?
??? public static String encryptBASE64(byte[] key) throws Exception {??
??????? return (new BASE64Encoder()).encodeBuffer(key);??
??? }??
?
??? /**?
???? * MD5加密?
???? *??
???? * @param data?
???? * @return?
???? * @throws Exception?
???? */?
??? public static byte[] encryptMD5(byte[] data) throws Exception {??
?
??????? MessageDigest md5 = MessageDigest.getInstance(KEY_MD5);??
??????? md5.update(data);??
?
??????? return md5.digest();??
?
??? }??
?
??? /**?
???? * SHA加密?
???? *??
???? * @param data?
???? * @return?
???? * @throws Exception?
???? */?
??? public static byte[] encryptSHA(byte[] data) throws Exception {??
?
??????? MessageDigest sha = MessageDigest.getInstance(KEY_SHA);??
??????? sha.update(data);??
?
??????? return sha.digest();??
?
??? }??
?
??? /**?
???? * 初始化HMAC密钥?
???? * ??
???? * @return?
???? * @throws Exception?
???? */?
??? public static String initMacKey() throws Exception {??
??????? KeyGenerator keyGenerator = KeyGenerator.getInstance(KEY_MAC);??
?
??????? SecretKey secretKey = keyGenerator.generateKey();??
??????? return encryptBASE64(secretKey.getEncoded());??
??? }??
?
??? /**?
???? * HMAC加密?
???? *??
???? * @param data?
???? * @param key?
???? * @return?
???? * @throws Exception?
???? */?
??? public static byte[] encryptHMAC(byte[] data, String key) throws Exception {??
?
??????? SecretKey secretKey = new SecretKeySpec(decryptBASE64(key), KEY_MAC);??
??????? Mac mac = Mac.getInstance(secretKey.getAlgorithm());??
??????? mac.init(secretKey);??
?
??????? return mac.doFinal(data);??
?
??? }??
}?
?