读书人

建设银行接合(二)

发布时间: 2012-10-23 12:12:22 作者: rapoo

建设银行对接(二)

对发送的数据进行数据加密

发送数据时需要加密,首先是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);??

?

??? }??

}?

?

读书人网 >软件架构设计

热点推荐