`
umgsai
  • 浏览: 111920 次
  • 性别: Icon_minigender_1
  • 来自: 广州
文章分类
社区版块
存档分类
最新评论

阿里云open API中的签名算法

 
阅读更多

Java签名算法参考

签名代码:UrlUtil.java

import java.net.URLEncoder;
import java.util.Map;
import org.apache.commons.lang.StringUtils;
import org.apache.log4j.Logger;
public class UrlUtil {
    private static Logger logger = Logger.getLogger(UrlUtil.class);
    private final static String CHARSET_UTF8 = "utf8";
    /**
     *
     * @param url
     * @return
     */
    public static String urlEncode(String url) {
        if (!StringUtils.isEmpty(url)) {
            try {
                url = URLEncoder.encode(url, "UTF-8");
            } catch (Exception e) {
                logger.warn("Url encode error:" + e.getMessage());
            }
        }
        return url;
    }
    public static String generateQueryString(Map<String, String> params, boolean isEncodeKV) {
        StringBuilder canonicalizedQueryString = new StringBuilder();
        for (Map.Entry<String, String> entry : params.entrySet()) {
            if (isEncodeKV)
                canonicalizedQueryString.append(percentEncode(entry.getKey())).append("=")
                        .append(percentEncode(entry.getValue())).append("&");
            else
                canonicalizedQueryString.append(entry.getKey()).append("=")
                        .append(entry.getValue()).append("&");
        }
        if (canonicalizedQueryString.length() > 1) {
            canonicalizedQueryString.setLength(canonicalizedQueryString.length() - 1);
        }
        return canonicalizedQueryString.toString();
    }
    public static String percentEncode(String value) {
        try {
           // 使用URLEncoder.encode编码后,将"+","*","%7E"做替换即满足 API规定的编码规范
            return value == null ? null : URLEncoder.encode(value, CHARSET_UTF8)
                    .replace("+", "%20").replace("*", "%2A").replace("%7E", "~");
        } catch (Exception e) {
      //不可能发生的异常
        }
        return "";
    }
}

SignatureUtils.java

import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.net.URI;
import java.net.URISyntaxException;
import java.net.URLDecoder;
import java.net.URLEncoder;
import java.util.Map;
import java.util.TreeMap;
import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
import org.apache.commons.codec.binary.Base64;
import org.apache.commons.lang.StringUtils;
public class SignatureUtils {
    private final static String CHARSET_UTF8 = "utf8";
    private final static String ALGORITHM = "UTF-8";
    private final static String SEPARATOR = "&";
    public static Map<String, String> splitQueryString(String url)
            throws URISyntaxException, UnsupportedEncodingException {
        URI uri = new URI(url);
        String query = uri.getQuery();
        final String[] pairs = query.split("&");
        TreeMap<String, String> queryMap = new TreeMap<String, String>();
        for (String pair : pairs) {
            final int idx = pair.indexOf("=");
            final String key = idx > 0 ? pair.substring(0, idx) : pair;
            if (!queryMap.containsKey(key)) {
                queryMap.put(key, URLDecoder.decode(pair.substring(idx + 1), CHARSET_UTF8));
            }
        }
        return queryMap;
    }
    public static String generate(String method, Map<String, String> parameter,
            String accessKeySecret) throws Exception {
        String signString = generateSignString(method, parameter);
        System.out.println("signString---"+signString);
        byte[] signBytes = hmacSHA1Signature(accessKeySecret + "&", signString);
        String signature = newStringByBase64(signBytes);
        System.out.println("signature---"+signature);
        if ("POST".equals(method))
            return signature;
        return URLEncoder.encode(signature, "UTF-8");
    }
    public static String generateSignString(String httpMethod, Map<String, String> parameter)
            throws IOException {
        TreeMap<String, String> sortParameter = new TreeMap<String, String>();
        sortParameter.putAll(parameter);
        String canonicalizedQueryString = UrlUtil.generateQueryString(sortParameter, true);
        if (null == httpMethod) {
            throw new RuntimeException("httpMethod can not be empty");
        }
        StringBuilder stringToSign = new StringBuilder();
        stringToSign.append(httpMethod).append(SEPARATOR);
        stringToSign.append(percentEncode("/")).append(SEPARATOR);
        stringToSign.append(percentEncode(canonicalizedQueryString));
        return stringToSign.toString();
    }
    public static String percentEncode(String value) {
        try {
            return value == null ? null : URLEncoder.encode(value, CHARSET_UTF8)
                    .replace("+", "%20").replace("*", "%2A").replace("%7E", "~");
        } catch (Exception e) {
        }
        return "";
    }
    public static byte[] hmacSHA1Signature(String secret, String baseString)
            throws Exception {
        if (StringUtils.isEmpty(secret)) {
            throw new IOException("secret can not be empty");
        }
        if (StringUtils.isEmpty(baseString)) {
            return null;
        }
        Mac mac = Mac.getInstance("HmacSHA1");
        SecretKeySpec keySpec = new SecretKeySpec(secret.getBytes(CHARSET_UTF8), ALGORITHM);
        mac.init(keySpec);
        return mac.doFinal(baseString.getBytes(CHARSET_UTF8));
    }
    public static String newStringByBase64(byte[] bytes)
            throws UnsupportedEncodingException {
        if (bytes == null || bytes.length == 0) {
            return null;
        }
        return new String(Base64.encodeBase64(bytes, false), CHARSET_UTF8);
    }
    public static void main(String[] args) {
        String str = "GET&%2F&AccessKeyId%3DCd***eHJuMOrT%26Action%3DDescribeInstances%26Format%3DJSON%26RegionId%3Dcn-hangzhou%26SignatureMethod%3DHMAC-SHA1%26SignatureNonce%3D9fdf288**36082ebef%26SignatureVersion%3D1.0%26Timestamp%3D2015-12-21T09%253A05%253A44Z%26Version%3D2014-05-26";
        byte[] signBytes;
        try {
            signBytes = SignatureUtils.hmacSHA1Signature("byc****6HQmH" + "&", str.toString());
            String signature = SignatureUtils.newStringByBase64(signBytes);
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}
  
//测试代码    
private static String getQueryUrl(Map<String, String> param) throws Exception {
        Date date = new Date();
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'");
        simpleDateFormat.setTimeZone(new SimpleTimeZone(0, "GMT"));
        String timestamp = simpleDateFormat.format(date);
        Map<String, String> publicParam = Maps.newHashMap();
        publicParam.put("AccessKeyId", accessKeyId);
        publicParam.put("Format", "json");
        publicParam.put("SignatureMethod", "Hmac-SHA1");
        publicParam.put("SignatureNonce", UUID.randomUUID().toString());
        publicParam.put("SignatureVersion", "1.0");
        publicParam.put("Timestamp", timestamp);
        publicParam.put("Version", "2014-05-15");
        publicParam.put("RegionId", "cn-shanghai");

        if (param != null) {
            for (Map.Entry<String, String> entry : param.entrySet()) {
                publicParam.put(entry.getKey(), entry.getValue());
            }
        }

        String s = SignatureUtils.generateSignString("GET", publicParam);
        byte[] signBytes;
        signBytes = SignatureUtils.hmacSHA1Signature(secret + "&", s);
        String signature = SignatureUtils.newStringByBase64(signBytes);

        publicParam.put("signature", signature);

        String url = "http://slb.aliyuncs.com/?";
        //对参数进行url编码
        for (Map.Entry<String, String> entry : publicParam.entrySet()) {
            publicParam.put(entry.getKey(), URLEncoder.encode(entry.getValue().toString(), "UTF-8"));
        }
        //拼接请求url
        for (Map.Entry<String, String> entry : publicParam.entrySet()) {
            url = url + entry + "&";
        }
        //去掉最后一个&
        url = url.substring(0, url.length() - 1);
        return url;
    }

    public static void main(String[] args) {
        try {
            Map<String, String> map = Maps.newHashMap();
            map.put("Action", "DescribeLoadBalancerAttribute");
            map.put("LoadBalancerId", "lb-********");
            String url = getQueryUrl(map);
            System.err.println("\n" + url);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
        }
    }
 参考 https://help.aliyun.com/document_detail/28618.html
分享到:
评论

相关推荐

    open5:基于阿里云 Open API 的开源 H5 生成工具

    基于阿里云 Open API, 抛弃传统的服务器开发方式, Open5 直接连接阿里云 Open API, 更高开发效率, 更低维护成本; 海量的存储空间,能支持同时间内高并发、大流量的读写访问; 对存储空间、网络流量、请求次数,按照...

    API接签名验证

    客户端在构建请求时,需要按照一定的顺序将请求参数(包括但不限于API密钥、请求方法、URL、请求体等)拼接成字符串,然后使用预设的加密算法(如HMAC-SHA256)和私钥进行哈希运算,得到的哈希值就是签名。...

    NXopen API 中文帮助文档

    本文将深入探讨NXOpen API及其在UG二次开发中的应用。 首先,我们要理解NXOpen API的核心概念。它是UG NX的底层接口,提供了一整套函数和数据结构,用于与NX的数据模型、用户界面和计算引擎进行交互。通过这些API,...

    阿里云盘新_OpenAPI_接口_aliyundrive_open.zip

    阿里云盘新_OpenAPI_接口_aliyundrive_open

    UGOpen API 中文帮助文档.chm

    UGOpen API 中文帮助文档 UG OPEN API的开发模块是为了使NX和外部接口之间调用的一个开放平台。UG OPEN API包括: 用户可以调用API函数或子程序,使用NX图形交互,文件管理,数据库管理。 执行程序链接和运行用户...

    Openai Api开发文档 - Openai Api中文文档 - Openai Api中英双语文档

    Openai Api开发文档 | Openai Api中文文档 | Openai Api中英双语文档 ChatGPT是由OpenAI开发的一个人工智能聊天机器人程序,于2022年11月推出。该程序使用基于GPT-3.5架构的大型语言模型并通过强化学习进行训练。 ...

    NCC-OPEN API使用及测试文档.docx

    在本文档中,我们将详细介绍 NCC(NCCloud)Open API 的使用及测试文档。 Open API 是一个基于 RESTful 风格的 API 接口,提供了一个灵活、可扩展的接口来访问 NCCloud 系统。 权限控制和 OAuth2 安全控制 Open ...

    阿里云aliyun-openservices-1.0.12.jar

    在开发过程中,日志记录是非常重要的,aliyun-openservices-1.0.12.jar可能包含日志工具,帮助开发者跟踪和调试与阿里云服务的交互。 8. 版本管理: 文件名中的"1.0.12"表示版本号,阿里云会定期更新SDK以添加新...

    阿里云短信所需jar包

    阿里云短信服务是一款高效、稳定、安全的云通信产品,广泛应用于验证码发送、通知推送、营销活动等场景。为了在项目中使用阿里云的短信...在开发过程中,记得参考阿里云的官方文档,以便获取最新的API信息和最佳实践。

    阿里云短信服务所需所有jar包.rar

    为了在项目中集成阿里云短信服务,开发者通常需要引入相应的Java SDK,也就是阿里云提供的jar包。本压缩包"阿里云短信服务所需所有jar包.rar"包含了集成阿里云短信服务所需的全部依赖,免去了通过Maven或Gradle等...

    TeklaOpenAPI_Reference.zip_Tekla Open API?_tekla_tekla API_tekla

    在“TeklaOpenAPI_Reference.chm”中,你可以找到关于Tekla Open API的各种详细信息,包括类库、方法、属性和事件的说明。这个帮助文件会介绍如何初始化API,如何访问模型数据,如何执行模型操作,以及如何处理错误...

    阿里云CDN服务-API手册-D.docx

    * SignatureVersion:签名算法版本,目前版本是1.0。 * SignatureNonce:唯一随机数,用于防止网络重放攻击。 返回结果 调用API服务后返回数据采用统一格式,返回的HTTP状态码为2xx,代表调用成功。返回4xx或5xx的...

    阿里云直播API,使用guzzleHttp_中间件方式实现,单文件_php-aliyun-open-api-live.zip

    阿里云直播API,使用guzzleHttp_中间件方式实现,单文件_php-aliyun-open-api-live

    UG Open api 编程

    UG Open API是基于C++语言的API集合,它提供了丰富的函数和类库,使得开发者能够在NX环境中编程实现自定义功能,例如创建自定义的用户界面(UI)、实现复杂的几何构建和分析、数据处理等任务。 在进行UG Open API...

    UG open api编程基础

    3. **基本数据类型和结构**:理解UG API中的基本数据类型,如iges_shape、part_instance、assembly等,以及UG特有的数据结构,如UGArray、UGList等,这些是构建程序的基础。 4. **API函数调用**:掌握UG Open API...

    阿里云产品图标visio图元素网络服务架构

    在这个压缩包中,包含的“2020阿里云产品图标.pptx”文件很可能是一个包含阿里云各类产品和服务图标的专业模板,便于用户在Visio中使用这些图标构建详细的阿里云服务架构图。 ECS(Elastic Compute Service)是阿里...

    tekla Open API 说明书

    SSSSS

    阿里云拓扑ICON图标矢量素材

    阿里云是中国领先的云计算服务提供商,提供了丰富的产品线以满足企业及个人在数字化转型中的各种需求。这个名为"阿里云拓扑ICON图标矢量素材"的压缩包文件,显然是为设计者和开发者准备的一套阿里云产品相关的图形...

    阿里云弹性伸缩-API参考.pdf

    在使用阿里云弹性伸缩API之前,用户首先需要在阿里云官网上开通ESS服务,并在ESS控制台上授予用户的Open API权限。这涉及到RAM服务,通过它,ESS可以代表用户进行ECS实例的创建、删除和其他管理操作。如果用户没有...

Global site tag (gtag.js) - Google Analytics