java 阿里云api请求签名算法实践

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;
    }
}

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值