对发送的数据进行数据加密
发送数据时需要加密,首先是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);
}
}