// 3.簽名
Map signData = XhPayUtil.sign(reqData, "utf-8");
/**
* 生成簽名值(SHA1摘要算法)
*
* @param data
* 待簽名數據Map鍵值對形式
* @param encoding
* 編碼
* @return 簽名是否成功
*/
public static Map sign(Map<String, String> data, String encoding) {
Map signMap = new HashMap();
String transData = createTransDataByMap(data);
signMap.put("transData", transData);
signMap.put("signMsg", signByStr(transData, encoding));
System.out.println("數據:" + signMap);
return signMap;
}
/**
* 將map數據按key=value&key=value進行組裝
*
* @param data
* @param encoding
* @return
*/
public static String createTransDataByMap(Map data) {
if (data == null || data.isEmpty()) {
return "";
}
StringBuffer sb = new StringBuffer();
Iterator iter = data.keySet().iterator();
while (iter.hasNext()) {
Object key = iter.next();
sb.append(key).append("=").append(data.get(key)).append("&");
}
sb.deleteCharAt(sb.length() - 1);// 清楚最後一個&
return sb.toString();
}
/**
* 簽名
*
* @param transData
* @param encoding
* @return
*/
public static String signByStr(String transData, String encoding) {
System.out.println("調用簽名方法....");
String webappPath = FileUtils.getProjectPath();
log.info("證書加載路徑爲={}", webappPath);
String[] b = transData.split("&");
String c = "";
String merchId = "";
for (int i = 0; i < b.length; i++) {
c = b[i];
if (c.indexOf("merchId=") != -1) {
merchId = c.substring(8, c.length());
}
}
if (pfx_path == null) {
pfx_path = webappPath + Properties.getString("pfxDir") + "/"
+ merchId + "/" + merchId + ".pfx";
// pfx_path = Properties.getString("pfxDir") + "/" + merchId + "/"
// + merchId + ".pfx";
}
if (pfx_pwd == null) {
pfx_pwd = Properties.getString("pfx_pwd");
}
if (!new File(pfx_path).exists()) {
System.err.println(pfx_path + "文件不存在");
pfx_path = null;
throw new RuntimeException("商戶證書不存在");
}
byte[] byteSign = null;
try {
byte[] signDigest = transData.getBytes(encoding);// SecureUtil.sha1X16(stringData,
// encoding);
byteSign = SecureUtil
.signBySoft(CertUtil.getSignCertPrivateKeyByStoreMap(
pfx_path, pfx_pwd), signDigest);
pfx_path = null;
// 設置簽名域值
} catch (Exception e) {
LogUtil.writeErrorLog("簽名異常", e);
}
if (byteSign == null) {
LogUtil.writeErrorLog("簽名異常");
pfx_path = null;
return "";
}
String signStr = Base64.encode(byteSign);
System.out.println("signStr:" + signStr);
return signStr;
}
public static PrivateKey getSignCertPrivateKeyByStoreMap(String certPath,
String certPwd) {
if (!certKeyStoreMap.containsKey(certPath)) {
loadRsaCert(certPath, certPwd);
}
try {
Enumeration<String> aliasenum = certKeyStoreMap.get(certPath)
.aliases();
String keyAlias = null;
if (aliasenum.hasMoreElements()) {
keyAlias = aliasenum.nextElement();
}
PrivateKey privateKey = (PrivateKey) certKeyStoreMap.get(certPath)
.getKey(keyAlias, certPwd.toCharArray());
return privateKey;
} catch (KeyStoreException e) {
LogUtil.writeErrorLog("getSignCertPrivateKeyByStoreMap Error", e);
return null;
} catch (UnrecoverableKeyException e) {
LogUtil.writeErrorLog("getSignCertPrivateKeyByStoreMap Error", e);
return null;
} catch (NoSuchAlgorithmException e) {
LogUtil.writeErrorLog("getSignCertPrivateKeyByStoreMap Error", e);
return null;
}
}
/**
* 軟簽名
*
* @param privateKey
* 私鑰
* @param data
* 待簽名數據
* @param signMethod
* 簽名方法
* @return 結果
* @throws Exception
*/
public static byte[] signBySoft(PrivateKey privateKey, byte[] data)
throws Exception {
byte[] result = null;
Signature st = Signature.getInstance(BC_PROV_ALGORITHM_SHA256RSA);
st.initSign(privateKey);
st.update(data);
result = st.sign();
String s = Base64.encodeBase64String(result);
System.out.println(s);
return result;
}
/**
* 算法常量:SHA1withRSA
*/
private static final String BC_PROV_ALGORITHM_SHA256RSA = "SHA256withRSA";