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
相关推荐
UG二次开发NXopen API中文帮助文档,可用于NX OPEN C/C++ 的二次开发
http Restful API接签名验证 ,防API接口进行在公网裸奔
UGOpen API 中文帮助文档 UG OPEN API的开发模块是为了使NX和外部接口之间调用的一个开放平台。UG OPEN API包括: 用户可以调用API函数或子程序,使用NX图形交互,文件管理,数据库管理。 执行程序链接和运行用户...
Openai Api开发文档 | Openai Api中文文档 | Openai Api中英双语文档 ChatGPT是由OpenAI开发的一个人工智能聊天机器人程序,于2022年11月推出。该程序使用基于GPT-3.5架构的大型语言模型并通过强化学习进行训练。 ...
基于阿里云 Open API, 抛弃传统的服务器开发方式, Open5 直接连接阿里云 Open API, 更高开发效率, 更低维护成本; 海量的存储空间,能支持同时间内高并发、大流量的读写访问; 对存储空间、网络流量、请求次数,按照...
【项目资源】: 包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。 ... 【项目质量】: 所有源码都经过严格测试,...
赠送jar包:opentracing-api-0.33.0.jar; 赠送原API文档:opentracing-api-0.33.0-javadoc.jar; 赠送源代码:opentracing-api-0.33.0-sources.jar; 赠送Maven依赖信息文件:opentracing-api-0.33.0.pom; 包含...
使用阿里云发短信功能需要的三个jar包,本人通过这三个jar实现了发短信功能,是可以直接使用的,----------
NXOpen Python API Refence 10.0 在线文档,经过下载整理,制作成了离线文档,便于在断网环境下学习。
Tekla Structure 二次开发基础
赠送jar包:opentracing-api-0.33.0.jar 赠送原API文档:opentracing-api-0.33.0-javadoc.jar 赠送源代码:opentracing-api-0.33.0-sources.jar 包含翻译后的API文档:opentracing-api-0.33.0-javadoc-API文档-...
Open3D-ICP算法测试数据Open3D-ICP算法测试数据Open3D-ICP算法测试数据Open3D-ICP算法测试数据Open3D-ICP算法测试数据Open3D-ICP算法测试数据Open3D-ICP算法测试数据Open3D-ICP算法测试数据Open3D-ICP算法测试数据
该资源为在购买了阿里云中间件产品rocketmq消息队列之后,使用的连接rocketmq的demo工程,该程序以 Java 为例,包括普通消息、事务消息、定时消息的测试代码,以及相关 Spring 的配置示例,同时提供tcp连接的程序。
适用于微信开放标签签名算法wx-open-launch-weapp
基于Openmesh的孔洞修补算法,带洞模型已经包含
短信服务(Short Message Service)是阿里云为用户提供的一种通信服务的能力。 支持向国内和国际快速发送验证码、短信通知和推广短信,服务范围覆盖全球200多个国家和地区。国内短信支持三网合一专属通道,与工信部...
OpengRTB-API-2.5版本中文版文档,实时竞价(RTB)项目OpenRTB API规范版本2.5。
open-api-sdk-2.0和jackson,京东宙斯开发jar包,宙斯API包,本人开发使用,open-api-sdk-2.0.jar,jackson-core-asl-1.9.8.jar,jackson-mapper-asl-1.9.8.jar,需要朋友可自行下载
org.simalliance.openmobileapi.jar