阿里云请求签名Java实现

简介: 为保证API的安全调用,在调用API时阿里云会对每个API请求通过签名(Signature)进行身份验证。无论使用HTTP还是HTTPS协议提交请求,都需要在请求中包含签名信息。在使用阿里云文字识别ocr时,看到官网提供了Python的构造签名示例,此篇文章就以官网提供的参数以Java方式构造下签名

Step By Step

1.添加下依赖

<dependency>
            <groupId>commons-codec</groupId>
            <artifactId>commons-codec</artifactId>
            <version>1.4</version>
        </dependency>

2.添加下代码

import org.apache.commons.codec.binary.Base64;
import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
import java.security.NoSuchAlgorithmException;
import java.util.TreeMap;

public class testSignDemo {
    static final java.text.SimpleDateFormat DF = new java.text.SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'");

    public static void main(String[] args)throws Exception {
        //这里的参数复制的官方文档的,为了计算出与文档上的相同值进行验证
        String accessKeyId = "testid";
        String accessSecret = "testsecret";
        String action = "DescribeRegions";
        getSignature(action,accessKeyId,accessSecret);
    }
    public static void getSignature(String action, String accessKeyId, String accessSecret) throws Exception {
        //声明个排序map接受参数
        TreeMap<String,String> paras = new TreeMap<String, String>();
        paras.put("AccessKeyId",accessKeyId);
        paras.put("Action",action);
        paras.put("Format","XML");
        //paras.put("SignatureNonce",java.util.UUID.randomUUID().toString());
        paras.put("SignatureNonce","3ee8c1b8-83d3-44af-a94f-4e0ad82fd6cf");
        paras.put("SignatureVersion","1.0");
        //paras.put("Timestamp", DF.format(new java.util.Date()));
        paras.put("Timestamp", "2016-02-23T12:46:24Z");
        paras.put("Version","2014-05-26");
        paras.put("SignatureMethod","HMAC-SHA1");

        //拼接请求参数
        StringBuilder keys = new StringBuilder();
        java.util.Iterator<String> it = paras.keySet().iterator();
        while (it.hasNext()){
            String key = it.next();
            keys = keys.append("&").append(key).append("=").append(specialUrlEncode(paras.get(key)));
        }
        System.out.println(keys);
        //拼接完要将第一个&去掉
        String sign =keys.substring(1);

        //拼接请求方法
        StringBuilder signAll = new StringBuilder();
        signAll.append("GET").append("&").append(specialUrlEncode("/")).append("&");
        //构造完整的请求字符串
        signAll.append(specialUrlEncode(sign));
        //把 accessKeySecret加上"&"构成 HMAC-SHA1 算法的key
        String accessSecretKey = accessSecret+"&";
        //计算签名值
        String signature = getSignature(signAll.toString(),accessSecretKey);
        System.out.println(signature);

    }
    //
    public static String specialUrlEncode(String value) throws Exception {
        return java.net.URLEncoder.encode(value, "UTF-8").replace("+", "%20").replace("*", "%2A").replace("%7E", "~");
    }
    public static String getSignature(String stringTosign, String accessSecretKey) throws NoSuchAlgorithmException {
        byte[] result = null;
        try {
            //根据给定的字节数组构造一个密钥,第二参数指定一个密钥算法的名称
            SecretKeySpec signinKey = new SecretKeySpec(accessSecretKey.getBytes(), "HmacSHA1");
            //生成一个指定 Mac 算法 的 Mac 对象
            Mac mac = Mac.getInstance("HmacSHA1");
            //用给定密钥初始化 Mac 对象
            mac.init(signinKey);
            //完成 Mac 操作
            byte[] rawHmac = mac.doFinal(stringTosign.getBytes());
            result = Base64.encodeBase64(rawHmac);


        } catch (Exception e) {
            System.err.println(e.getMessage());
        }
        if (null != result) {
            return new String(result);
        } else {
            return null;
        }
    }

}

3.运行结果确认与官方网站上的结果

image.png

image.png

参考文档

签名机制
Java加密
请求签名

目录
相关文章
|
1天前
|
运维 监控 算法
java实现一个动态监控系统,监控接口请求超时的趋势
java实现一个动态监控系统,监控接口请求超时的趋势
17 2
|
1天前
|
Kubernetes Java 应用服务中间件
Kubernetes 上搭建一个 Nginx 的 Pod,并确保传入的 API 请求被均匀地分发到两个 Java 业务 Pod 上
Kubernetes 上搭建一个 Nginx 的 Pod,并确保传入的 API 请求被均匀地分发到两个 Java 业务 Pod 上
5 0
|
7天前
|
Java 对象存储
阿里云OSS上传下载文件java
阿里云OSS上传下载文件java
45 0
|
13天前
|
安全 Java 开发者
【技术咖必看】Java异常处理新境界:throws关键字,打造万无一失的方法签名!
【6月更文挑战第19天】在Java异常处理中,`throws`关键字用于方法签名,声明可能抛出的异常,提示调用者必须处理。它区分运行时异常和检查型异常,常用于声明需要调用者捕获的检查型异常。例如,`readFile`方法`throws IOException`,强制调用者通过try-catch或同样`throws`。多异常声明允许一次声明多个可能的异常类型,增强代码健壮性。理解并善用`throws`能构建更稳定、可读的代码。
|
13天前
|
安全 Java 程序员
【程序猿逆袭指南】Java高手的秘密武器:throws关键字,让你的方法签名霸气侧漏!
【6月更文挑战第19天】`throws`关键字是Java异常处理的关键,用于方法签名中声明可能抛出的异常,提示调用者处理。它增进代码可读性和安全性,避免运行时崩溃。通过`throws`声明多个异常,能精细规划错误处理。掌握其使用,能提升代码质量和程序员的专业形象,是Java编程中的必备技能。
|
14天前
|
Java 对象存储
java对接阿里云OSS上传
java对接阿里云OSS上传
84 2
|
14天前
|
Web App开发 JSON Java
JavaWeb基础第五章(请求,响应与分层解耦)
JavaWeb基础第五章(请求,响应与分层解耦)
|
21天前
|
自然语言处理 Java 测试技术
使用PostMan请求阿里云通义千问大模型
本文介绍如果通过postman调用阿里云通义千问API,然后介绍如果使用多语言集成,最后介绍了快速使用postman压测创建的API请求。
350 1
|
25天前
|
JSON 安全 Java
JAVA Socket 实现HTTP与HTTPS客户端发送POST与GET方式请求
JAVA Socket 实现HTTP与HTTPS客户端发送POST与GET方式请求
25 0
|
3天前
|
弹性计算 安全 前端开发
阿里云服务器ECS通用型、计算型和内存型详细介绍和性能参数表
阿里云ECS实例有计算型(c)、通用型(g)和内存型(r)三种,主要区别在于CPU和内存比例。计算型CPU内存比1:2,如2核4G;通用型为1:4,如2核8G;内存型为1:8,如2核16G。随着技术迭代,有第五代至第八代产品,如c7、g5、r8a等。每代实例在CPU型号和主频上相同,但性能有所提升。实例性能参数包括网络带宽、收发包能力、连接数等。具体应用场景如计算型适合高网络包收发、通用型适合企业级应用,内存型适合内存数据库等。详细信息可参阅阿里云ECS页面。

热门文章

最新文章