public class ZCloudSignUtil { public static boolean verify(Map<String, String> params, String md5_key) { if (params.get("sign") == null) { return false; } String sign = params.get("sign"); // 過濾空值、sign與sign_type參數 Map<String, String> sParaNew = ZCloudCore.paraFilter(params); // 獲取待簽名字符串 String preSignStr = ZCloudCore.createLinkString(sParaNew); // 獲得簽名驗證結果 return ZCloudMD5.verify(preSignStr, sign, md5_key); } public static String getSign(Map<String, String> params, String md5_key){ // 過濾空值、sign與sign_type參數 Map<String, String> sParaNew = ZCloudCore.paraFilter(params); // 獲取待簽名字符串 String preSignStr = ZCloudCore.createLinkString(sParaNew); return ZCloudMD5.sign(preSignStr, md5_key); } }
package net.joystart.baojia.sign; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; /** * 簽名核心類 * @author 劉禮濤 * */ public class ZCloudCore { /** * 除去數組中的空值和簽名參數 * @param sArray 簽名參數組 * @return 去掉空值與簽名參數后的新簽名參數組 */ public static Map<String, String> paraFilter(Map<String, String> sArray) { Map<String, String> result = new HashMap<String, String>(); if (sArray == null || sArray.size() <= 0) { return result; } for (String key : sArray.keySet()) { String value = sArray.get(key); if (value == null || value.equals("") || key.equalsIgnoreCase("sign") || key.equalsIgnoreCase("msg")) { continue; } result.put(key, value); } return result; } /** * 把數組所有元素排序,並按照“參數=參數值”的模式用“&”字符拼接成字符串 * @param params 需要排序並參與字符拼接的參數組 * @return 拼接后字符串 */ public static String createLinkString(Map<String, String> params) { List<String> keys = new ArrayList<String>(params.keySet()); Collections.sort(keys); String prestr = ""; for (int i = 0; i < keys.size(); i++) { String key = keys.get(i); String value = params.get(key); if (i == keys.size() - 1) {//拼接時,不包括最后一個&字符 prestr = prestr + key + "=" + value; } else { prestr = prestr + key + "=" + value + "&"; } } return prestr; } }
package net.joystart.baojia.sign; import java.io.UnsupportedEncodingException; import java.security.SignatureException; import org.apache.commons.codec.digest.DigestUtils; /** * 簽名MD5工具類 * @author 劉禮濤 * */ public class ZCloudMD5 { /** * 簽名字符串 * @param text 需要簽名的字符串 * @param key 密鑰 * @param input_charset 編碼格式 * @return 簽名結果 */ public static String sign(String text, String key) { text = text + key; return DigestUtils.md5Hex(getContentBytes(text)); } /** * 簽名字符串 * @param text 需要簽名的字符串 * @param sign 簽名結果 * @param key 密鑰 * @param input_charset 編碼格式 * @return 簽名結果 */ public static boolean verify(String text, String sign, String key) { text = text + key; String mysign = DigestUtils.md5Hex(getContentBytes(text)); if(mysign.equals(sign)) { return true; } else { return false; } } /** * @param content * @param charset * @return * @throws SignatureException * @throws UnsupportedEncodingException */ private static byte[] getContentBytes(String content) { try { return content.getBytes(ZCloudSignConfig.charset); } catch (UnsupportedEncodingException e) { throw new RuntimeException("MD5簽名過程中出現錯誤,指定的編碼集不對,"); } } }