SHA-256加密、验签
签名,将所有的POST 参数 (不包括数组、json对象、Sign和值为空的参数) 和Key (平台提供)拼成一个字符串
使用SHA-256 算法计算签名值
public static String sign(JSONObject jsObj, String key) {
ArrayList<String> list = new ArrayList<String>();
Iterator iter = jsObj.keys();
//将JSONObject(不包括数组、json对象、Sign和值为空的参数)转化为ArrayList集合
while (iter.hasNext()) {
String field = (String) iter.next();
Object value = jsObj.get(field);
if (!"Sign".equals(field) && !(value instanceof JSONArray)) {
list.add(field + "=" + value.toString());
}
}
//加入key
list.add("Key=" + key);
int size = list.size();
//集合转化为数组
String[] arrayToSort = list.toArray(new String[size]);
//按字典排序
Arrays.sort(arrayToSort);
//拼接成字符串
StringBuilder sb = new StringBuilder();
for (int i = 0; i < size; i++) {
if (i > 0)
sb.append("&");
sb.append(arrayToSort[i]);
}
String result = sb.toString();
//使用SHA-256(转换为16机制) 得到64 byte 的签名值
try {
MessageDigest messageDigest = MessageDigest.getInstance("SHA-256");
byte[] bytes = messageDigest.digest(result.getBytes());
result = Hex.encodeHexString(bytes);
} catch (Exception e) {// 忽略加密方式和字符集不支持异常
}
//返回结果
return result;
}
接口调用
String send = CCBScanService.send(jsonString, channel);
SignVerifyUtil.verify(JSONObject.fromObject(send)
接口返回数据进行二次验签
public static boolean verify(JSONObject jsObj, String key) {
String sign = jsObj.getString("Sign");
if (sign == null || sign.equals("")) {
return false;
}
return sign.equals(sign(jsObj, key));
}
链接: 原文