java签名DEMO如下:
package com.ksyun.util;
import org.apache.commons.codec.digest.HmacAlgorithms;
import org.apache.commons.codec.digest.HmacUtils;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
import java.util.HashMap;
import java.util.Map;
import java.util.TreeMap;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/***
使用时,把测试相关方法删掉。测试方法包括:main,test1,test2
把这个类拷贝到自己的工程内
签名调用:SignatureUtils.signature(params, secretKey)
**/
/**
* @author [email protected]
*/
public class SignatureUtils {
private static final Pattern ENCODED_CHARACTERS_PATTERN;
static {
StringBuilder pattern = new StringBuilder();
pattern.append(Pattern.quote("+"))
.append("|")
.append(Pattern.quote("*"))
.append("|")
.append(Pattern.quote("%7E"))
.append("|")
.append(Pattern.quote("%2F"));
ENCODED_CHARACTERS_PATTERN = Pattern.compile(pattern.toString());
}
/**
* 注意空格( )会编码成+号,所以+最后需要替换成%20(%20为空格)
* 在URLEncode后需对三种字符替换:加号(+)替换成 %20、星号(*)替换成 %2A、 %7E 替换回波浪号(~)
*/
private static String urlEncode(final String value, final boolean path) {
if (value == null) {
return "";
}
try {
String encoded = URLEncoder.encode(value, StandardCharsets.UTF_8.name());
Matcher matcher = ENCODED_CHARACTERS_PATTERN.matcher(encoded);
StringBuffer buffer = new StringBuffer(encoded.length());
while (matcher.find()) {
String replacement = matcher.group(0);
if ("+".equals(replacement)) {
replacement = "%20";
} else if ("*".equals(replacement)) {
replacement = "%2A";
} else if ("%7E".equals(replacement)) {
replacement = "~";
} else if (path && "%2F".equals(replacement)) {
replacement = "/";
}
matcher.appendReplacement(buffer, replacement);
}
matcher.appendTail(buffer);
return buffer.toString();
} catch (UnsupportedEncodingException ex) {
throw new RuntimeException(ex);
}
}
private static String getCanonicalizedQueryString(Map<String, Object> params) {
final Map<String, String> tmap = new TreeMap<>();
for (Map.Entry<String, Object> entry : params.entrySet()) {
String key = entry.getKey();
Object value = entry.getValue();
String encodedParamName = urlEncode(key, false);
String encodedValues = urlEncode(value.toString(), false);
tmap.put(encodedParamName, encodedValues);
}
final StringBuilder sb = new StringBuilder();
for (Map.Entry<String, String> entry : tmap.entrySet()) {
if (sb.length() > 0) {
sb.append("&");
}
sb.append(entry.getKey()).append('=').append(entry.getValue());
}
return sb.toString();
}
public static String signature(Map<String, Object> params, String secretKey) {
String canonicalizedQueryString = getCanonicalizedQueryString(params);
return new HmacUtils(HmacAlgorithms.HMAC_SHA_256, secretKey).hmacHex(canonicalizedQueryString);
}
public static void test2() {
String accesskey = "AKLTXQVF0pOmS6aahIrD5r0B3Q";
String secretKey = "OMovU5PTLh6y9E9Ioe3K411jt99VqyQSBXgAcDYlo49R3lvUIzb6e/efZCFDmtFlzw==";
Map<String, Object> params = new HashMap<>();
params.put("Accesskey", accesskey);//公共参数
params.put("Service", "iam");//公共参数
params.put("Action", "CreateUser");//公共参数
params.put("Version", "2015-11-01");//公共参数
params.put("Timestamp", "2021-08-12T02:47:36Z");//公共参数
params.put("SignatureVersion", "1.0");//公共参数
params.put("SignatureMethod", "HMAC-SHA256");//公共参数
params.put("UserName", "Ttest"); //api特有参数
params.put("RealName", "周四测试");//api特有参数
params.put("Email", "[email protected]");//api特有参数
params.put("Remark", "~ce shi*%#|+");//api特有参数
System.out.println(signature(params, secretKey));
}
public static void test1() {
String accesskey = "AKLTXQVF0pOmS6aahIrD5r0B3Q";
String secretKey = "OMovU5PTLh6y9E9Ioe3K411jt99VqyQSBXgAcDYlo49R3lvUIzb6e/efZCFDmtFlzw==";
Map<String, Object> params = new HashMap<>();
params.put("Accesskey", accesskey); //公共参数
params.put("Service", "iam"); //公共参数
params.put("Action", "GetUser"); //公共参数
params.put("Version", "2015-11-01"); //公共参数
params.put("Timestamp", "2021-08-06T07:45:36Z"); //公共参数
params.put("SignatureVersion", "1.0"); //公共参数
params.put("SignatureMethod", "HMAC-SHA256"); //公共参数
params.put("UserName", "freestest"); //api特有参数
System.out.println(signature(params, secretKey));
}
public static void main(String[] args) {
test1();//签名结果:9294d873d0f921bed24b6089708b66fbdfc4a6ea0eb30ad21e73ce603b82fbb7
test2();//签名结果:fc9088ab845949dac4040be9b7ce7859068b5c21d4c400fec8ee0cefb777f659
}
}
文档内容是否对您有帮助?
评价建议不能为空
非常感谢您的反馈,我们会继续努力做到更好!