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
相关推荐
基于阿里云 Open API, 抛弃传统的服务器开发方式, Open5 直接连接阿里云 Open API, 更高开发效率, 更低维护成本; 海量的存储空间,能支持同时间内高并发、大流量的读写访问; 对存储空间、网络流量、请求次数,按照...
客户端在构建请求时,需要按照一定的顺序将请求参数(包括但不限于API密钥、请求方法、URL、请求体等)拼接成字符串,然后使用预设的加密算法(如HMAC-SHA256)和私钥进行哈希运算,得到的哈希值就是签名。...
本文将深入探讨NXOpen API及其在UG二次开发中的应用。 首先,我们要理解NXOpen API的核心概念。它是UG NX的底层接口,提供了一整套函数和数据结构,用于与NX的数据模型、用户界面和计算引擎进行交互。通过这些API,...
阿里云盘新_OpenAPI_接口_aliyundrive_open
UGOpen API 中文帮助文档 UG OPEN API的开发模块是为了使NX和外部接口之间调用的一个开放平台。UG OPEN API包括: 用户可以调用API函数或子程序,使用NX图形交互,文件管理,数据库管理。 执行程序链接和运行用户...
Openai Api开发文档 | Openai Api中文文档 | Openai Api中英双语文档 ChatGPT是由OpenAI开发的一个人工智能聊天机器人程序,于2022年11月推出。该程序使用基于GPT-3.5架构的大型语言模型并通过强化学习进行训练。 ...
在本文档中,我们将详细介绍 NCC(NCCloud)Open API 的使用及测试文档。 Open API 是一个基于 RESTful 风格的 API 接口,提供了一个灵活、可扩展的接口来访问 NCCloud 系统。 权限控制和 OAuth2 安全控制 Open ...
在开发过程中,日志记录是非常重要的,aliyun-openservices-1.0.12.jar可能包含日志工具,帮助开发者跟踪和调试与阿里云服务的交互。 8. 版本管理: 文件名中的"1.0.12"表示版本号,阿里云会定期更新SDK以添加新...
阿里云短信服务是一款高效、稳定、安全的云通信产品,广泛应用于验证码发送、通知推送、营销活动等场景。为了在项目中使用阿里云的短信...在开发过程中,记得参考阿里云的官方文档,以便获取最新的API信息和最佳实践。
为了在项目中集成阿里云短信服务,开发者通常需要引入相应的Java SDK,也就是阿里云提供的jar包。本压缩包"阿里云短信服务所需所有jar包.rar"包含了集成阿里云短信服务所需的全部依赖,免去了通过Maven或Gradle等...
在“TeklaOpenAPI_Reference.chm”中,你可以找到关于Tekla Open API的各种详细信息,包括类库、方法、属性和事件的说明。这个帮助文件会介绍如何初始化API,如何访问模型数据,如何执行模型操作,以及如何处理错误...
* SignatureVersion:签名算法版本,目前版本是1.0。 * SignatureNonce:唯一随机数,用于防止网络重放攻击。 返回结果 调用API服务后返回数据采用统一格式,返回的HTTP状态码为2xx,代表调用成功。返回4xx或5xx的...
阿里云直播API,使用guzzleHttp_中间件方式实现,单文件_php-aliyun-open-api-live
UG Open API是基于C++语言的API集合,它提供了丰富的函数和类库,使得开发者能够在NX环境中编程实现自定义功能,例如创建自定义的用户界面(UI)、实现复杂的几何构建和分析、数据处理等任务。 在进行UG Open API...
3. **基本数据类型和结构**:理解UG API中的基本数据类型,如iges_shape、part_instance、assembly等,以及UG特有的数据结构,如UGArray、UGList等,这些是构建程序的基础。 4. **API函数调用**:掌握UG Open API...
在这个压缩包中,包含的“2020阿里云产品图标.pptx”文件很可能是一个包含阿里云各类产品和服务图标的专业模板,便于用户在Visio中使用这些图标构建详细的阿里云服务架构图。 ECS(Elastic Compute Service)是阿里...
SSSSS
阿里云是中国领先的云计算服务提供商,提供了丰富的产品线以满足企业及个人在数字化转型中的各种需求。这个名为"阿里云拓扑ICON图标矢量素材"的压缩包文件,显然是为设计者和开发者准备的一套阿里云产品相关的图形...
在使用阿里云弹性伸缩API之前,用户首先需要在阿里云官网上开通ESS服务,并在ESS控制台上授予用户的Open API权限。这涉及到RAM服务,通过它,ESS可以代表用户进行ECS实例的创建、删除和其他管理操作。如果用户没有...