package com.kf.goodidea;
import java.net.URLEncoder;
import java.io.UnsupportedEncodingException;
import java.text.SimpleDateFormat;
import java.util.*;
//import sun.misc.BASE64Encoder;
import java.util.Base64;
import javax.crypto.SecretKey;
import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
public class AssembleUrl {
//计算签名方法,注意参数salt入参应该为阿里云secret+"&"
public String sign(String salt ,String strToSign)
throws Exception {
Base64.Encoder base64e = Base64.getEncoder();
String signature = base64e.encodeToString(HmacSha1(salt, strToSign));
return signature;
}
//参数排序方法
public static void sortWithFirstCharacter(String[] arrstr){
int x;
int y;
String middllStr;
for (x=1;x<arrstr.length-1;x++) {
int end = arrstr.length-x;
for (y=0; y<end; y++) {
if (arrstr[y].compareTo(arrstr[y+1]) > 0) {
middllStr = arrstr[y];
arrstr[y] = arrstr[y+1];
arrstr[y+1] = middllStr;
}
}
}
}
//百分号编码方法
public static String percentEncode(String value) throws UnsupportedEncodingException {
return value != null ? URLEncoder.encode(value, "UTF-8").replace("+",
"%20").replace("*", "%2A").replace("%7E",
"~") : null;
}
//构造请求规范化字符串
private static String CanonicalizedQueryString(Map<String, String> parameterPairs) throws UnsupportedEncodingException {
Set<String> parameters = parameterPairs.keySet();
String[] a = parameters.toArray(new String[0]);
sortWithFirstCharacter(a);
String canonicalizedQueryString = "";
for (int i=0;i<a.length;i++) {
canonicalizedQueryString = canonicalizedQueryString + "&" + percentEncode(a[i]) + "=" + percentEncode(parameterPairs.get(a[i]));
}
return canonicalizedQueryString.substring(1);
}
//构造待签名字符串
private static String getStrToSign (String HttpMethod, String canonicalizedQueryString)
throws UnsupportedEncodingException{
return HttpMethod + "&" + percentEncode("/") + "&" + percentEncode(canonicalizedQueryString);
}
public static byte[] HmacSha1(String encryptKey, String encryptText) throws Exception {
byte[] data = encryptKey.getBytes("UTF-8");
SecretKey secretKey = new SecretKeySpec(encryptKey.getBytes(), "HmacSHA1");
Mac mac = Mac.getInstance("HmacSHA1");
mac.init(secretKey);
byte[] text = encryptText.getBytes("UTF-8");
//System.out.println(text.length);
return mac.doFinal(text);
}
private static final String ISO8601_DATE_FORMAT = "yyyy-MM-dd'T'HH:mm:ss'Z'";
public static String formatIso8601Date(Date date) {
SimpleDateFormat df = new SimpleDateFormat(ISO8601_DATE_FORMAT);
df.setTimeZone(new SimpleTimeZone(0, "GMT"));
return df.format(date);
}
public String GenerateUrl(HashMap<String, String> parameters, String HttpMethod, String secret, String EndPoint) throws Exception {
String canonicalizedQueryString = CanonicalizedQueryString(parameters);
String strToSign = getStrToSign(HttpMethod,canonicalizedQueryString);
String signature = sign(secret+"&", strToSign);
String url = EndPoint + "?" + canonicalizedQueryString + "&" + "Signature=" + percentEncode(signature);
return url;
}
}
java 阿里云api请求签名算法实践
最新推荐文章于 2024-02-20 12:00:00 发布