/** 计算签名 */
public String getSign(Map<String, String> params)
throws UnsupportedEncodingException {
TreeMap<String, String> map = Maps.newTreeMap();
map.putAll(params);
TreeSet<String> treeSet = Sets.newTreeSet();
for (Map.Entry<String, String> entry : map.entrySet()) {
treeSet.add(
URLEncoder.encode(entry.getKey(), StandardCharsets.UTF_8.name())
+ "="
+ URLEncoder.encode(entry.getValue(), StandardCharsets.UTF_8.name()));
}
String join = String.join("&", treeSet);
join = join.replace("+", "%20");
join = join.replace("*", "%2A");
join = join.replace("~", "%7E");
String code = URLEncoder.encode(join, StandardCharsets.UTF_8.name());
code = code.toUpperCase();
byte[] hmac = new HmacUtils(HmacAlgorithms.HMAC_SHA_1, secretAccessKey + "&").hmac(code);
return Base64.getEncoder().encodeToString(hmac);
}
Map<String, String> paramMap = new HashMap<>();
List<String> keyList = new ArrayList<>();
for (String param : params) {
String[] kv = param.split("\\=", 2);
keyList.add(kv[0]);
paramMap.put(kv[0], kv.length > 0 ? kv[1] : "");
}
keyList.sort(new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
return o1.compareTo(o2);
}
});
String stringToSign = method.toUpperCase() + accessKey + timeStamp + uuid;
for (String key : keyList) {
stringToSign += key;
stringToSign += paramMap.get(key);
}
Mac hmacSha256 = Mac.getInstance("HmacSHA256");
byte[] keyBytes = accessKey.getBytes(StandardCharsets.UTF_8);
hmacSha256.init(new SecretKeySpec(keyBytes, 0, keyBytes.length, "HmacSHA256"));
String sign = new String(
Base64.getEncoder().encode(hmacSha256.doFinal(stringToSign.getBytes(StandardCharsets.UTF_8))));
MD5加密:
String stringToSign = accessKey + accessSecret + timeStamp;
java.security.MessageDigest md5 = MessageDigest.getInstance("MD5");
byte[] signature = null;
signature = md5.digest(stringToSign.getBytes(StandardCharsets.UTF_8));
String ret = bytes2String(signature);
public static String bytes2String(byte[] signature) {
char[] chars = new char[signature.length * 2];
int i = 0;
for (byte sig : signature) {
chars[i++] = HEX_CHARS[(sig & 0xFF) >> 4];
chars[i++] = HEX_CHARS[sig & 0xF];
}
return new String(chars);
}