首页 » 网站建设 » phpascii升序技巧_JavaAPI

phpascii升序技巧_JavaAPI

访客 2024-12-02 0

扫一扫用手机浏览

文章目录 [+]

对时延敏感的业务,建议指定带地域的域名。

2. 通信协议

腾讯云 API 的所有接口均通过 HTTPS 进行通信,供应高安全性的通信通道。

phpascii升序技巧_JavaAPI

3. 要求方法

支持的 HTTP 要求方法:

phpascii升序技巧_JavaAPI
(图片来自网络侵删)
POST(推举)GET

POST 要求支持的 Content-Type 类型:

application/json(推举),必须利用署名方法 v3(TC3-HMAC-SHA256)。
application/x-www-form-urlencoded,必须利用署名方法 v1(HmacSHA1 或 HmacSHA256)。
multipart/form-data(仅部分接口支持),必须利用署名方法 v3(TC3-HMAC-SHA256)。

GET 要求的要求包大小不得超过32KB。
POST 要求利用署名方法 v1(HmacSHA1、HmacSHA256)时不得超过1MB。
POST 要求利用署名方法 v3(TC3-HMAC-SHA256)时支持10MB。

4. 字符编码

均利用 UTF-8 编码。

公共参数

公共参数是用于标识用户和接口署名的参数,每次要求均须要携带这些参数,才能正常发起要求。

署名方法 V3 公共参数

署名方法 v3(有时也称作 TC3-HMAC-SHA256)比较署名方法 v1(有些文档可能会简称“署名方法”),更安全,支持更大的要求包,支持 POST JSON 格式,性能有一定提升,推举利用该署名方法打算署名。
利用方法见下文 “署名方法先容” 。

参数名称

类型

必选

描述

X-TC-Action

String

操作的接口名称。
取值参考接口文档中输入参数公共参数 Action 的解释。
例如云做事器的查询实例列表接口,取值为 DescribeInstances。

X-TC-Region

String

-

地域参数,用来标识希望操作哪个地域的数据。
接口接管的地域取值参考接口文档中输入参数公共参数 Region 的解释。
把稳:某些接口不须要通报该参数,接口文档中会对此特殊解释,此时纵然通报该参数也不会生效。

X-TC-Timestamp

Integer

当前 UNIX 韶光戳,可记录发起 API 要求的韶光。
例如1529223702。
把稳:如果与做事器韶光相差超过5分钟,会引起署名过期缺点。

X-TC-Version

String

操作的 API 的版本。
取值参考接口文档中入参公共参数 Version 的解释。
例如云做事器的版本2017-03-12。

Authorization

String

HTTP 标准身份认证头部字段,例如:TC3-HMAC-SHA256 Credential=AKIDEXAMPLE/Date/service/tc3_request, SignedHeaders=content-type;host, Signature=72e494ea8a96525168个中:

TC3-HMAC-SHA256:署名方法,目前固定取该值。
Credential:署名凭据,AKIDEXAMPLE 是 SecretId。
Date 是 UTC 标准韶光的日期,取值须要和公共参数 X-TC-Timestamp 换算的 UTC 标准韶光日期同等。
service 为产品名,常日为域名前缀,例如域名 cvm.tencentcloudapi.com 意味着产品名是 cvm 。
本产品取值为 cvm。
SignedHeaders:参与署名打算的头部信息,content-type 和 host 为必选头部。
Signature:署名择要,打算过程详见下文。

X-TC-Token

String

临时证书所用的 Token ,须要结合临时密钥一起利用。
临时密钥和 Token 须要到访问管理做事调用接口获取。
长期密钥不须要 Token。

署名方法 V1 公共参数

利用署名方法 v1(有时会称作 HmacSHA256 和 HmacSHA1),公共参数须要统一放到要求串中。

参数名称

类型

必选

描述

Action

String

操作的接口名称。
取值参考接口文档中输入参数公共参数 Action 的解释。
例如云做事器的查询实例列表接口,取值为 DescribeInstances。

Region

String

-

地域参数,用来标识希望操作哪个地域的数据。
接口接管的地域取值参考接口文档中输入参数公共参数 Region 的解释。
把稳:某些接口不须要通报该参数,接口文档中会对此特殊解释,此时纵然通报该参数也不会生效。

Timestamp

Integer

当前 UNIX 韶光戳,可记录发起 API 要求的韶光。
例如1529223702,如果与当前韶光相差过大,会引起署名过期缺点。

Nonce

Integer

随机正整数,与 Timestamp 联合起来,用于防止重放攻击。

SecretId

String

在 云API密钥 上申请的标识身份的 SecretId,一个 SecretId 对应唯一的 SecretKey,而 SecretKey 会用来天生要求署名 Signature。

Signature

String

要求署名,用来验证这次要求的合法性,须要用户根据实际的输入参数打算得出。
详细打算方法拜会下文 “署名方法先容” 。

Version

String

操作的 API 的版本。
取值参考接口文档中入参公共参数 Version 的解释。
例如云做事器的版本2017-03-12。

SignatureMethod

String

署名办法,目前支持 HmacSHA256 和 HmacSHA1。
只有指定此参数为 HmacSHA256 时,才利用 HmacSHA256 算法验证署名,其他情形均利用 HmacSHA1 验证署名。

Token

String

临时证书所用的 Token ,须要结合临时密钥一起利用。
临时密钥和 Token 须要到访问管理做事调用接口获取。
长期密钥不须要 Token 。

地域列表

由于各个产品支持地域不同,详细详情请参考各产品文档中的地域列表。
例如,您可以参考云做事器的 地域列表。

Java API 调用办法

腾讯云 API 会对每个要求进行身份验证,用户须要利用安全凭据,经由特定的步骤对要求进行署名(Signature),每个要求都须要在公共要求参数中指定该署名结果并以指定的办法和格式发送要求。

假设用户的 SecretId 和 SecretKey 分别是:AKIDz8krbsJ5mLPx3EXAMPL 和 Gu5t9xGAREXAMPLE。
用户想查看广州区云做事器名为“不决名”的主机状态,只返回一条数据。
则要求可能为:

curl -X POST https://cvm.tencentcloudapi.com \-H "Authorization: TC3-HMAC-SHA256 Credential=AKIDz8krbsJ5mLPx3EXAMPL/2019-02-25/cvm/tc3_request, SignedHeaders=content-type;host, Signature=72e494ea8a96525168" \-H "Content-Type: application/json; charset=utf-8" \-H "Host: cvm.tencentcloudapi.com" \-H "X-TC-Action: DescribeInstances" \-H "X-TC-Timestamp: 1551113065" \-H "X-TC-Version: 2017-03-12" \-H "X-TC-Region: ap-guangzhou" \-d '{"Limit": 1, "Filters": [{"Values": ["\u672a\u547d\u540d"], "Name": "instance-name"}]}'步骤1:申请安全凭据

本文利用的安全凭据为密钥,密钥包括 SecretId 和 SecretKey。
每个用户最多可以拥有两对密钥。

SecretId:用于标识 API 调用者身份,可以大略类比为用户名。
SecretKey:用于验证 API 调用者的身份,可以大略类比为密码。

把稳

用户必须严格保管安全凭据,避免透露,否则将危及财产安全。
如已泄露,请急速禁用该安全凭据。

前往 API密钥管理 页面,即可进行获取。
如下图所示:

步骤2:1. 获取 API 3.0 V3 版本署名

署名方法 v3(TC3-HMAC-SHA256)功能上覆盖了以前的署名方法 v1 ,而且更安全,支持更大的要求,支持 JSON 格式,性能有一定提升,推举利用该署名方法打算署名。

把稳

首次打仗,建议利用 API Explorer 中的“署名串天生”功能,选择署名版本为“ API 3.0 署名 v3 ”,可以天生署名过程进行验证,也可直接天生 SDK 代码。
推举利用腾讯云 API 配套的7种常见的编程措辞 SDK,已经封装了署名和要求过程,均已开源,支持 Python、Java、PHP、Go、NodeJS、.NET、C++。

云 API 支持 GET 和 POST 要求。
对付 GET 方法,只支持 Content-Type: application/x-www-form-urlencoded 协议格式。
对付 POST 方法,目前支持 Content-Type: application/json 以及 Content-Type: multipart/form-data 两种协议格式,json 格式绝大多数接口均支持,multipart 格式只有特定接口支持,此时该接口不能利用 json 格式调用,参考详细业务接口文档解释。
推举利用 POST 要求,由于两者的结果并无差异,但 GET 要求只支持32KB以内的要求包。

下面以 查看实例列表 接口为例,分步骤先容署名的打算过程。
我们选择该接口是由于:

云做事器默认已开通,该接口很常用。
该接口是只读的,不会改变现有资源的状态。
接口覆盖的参数种类较全,可以演示包含数据构造的数组如何利用。
1. 拼接规范要求串

CanonicalRequest = HTTPRequestMethod + '\n' + CanonicalURI + '\n' + CanonicalQueryString + '\n' + CanonicalHeaders + '\n' + SignedHeaders + '\n' + HashedRequestPayload

字段名称

阐明

HTTPRequestMethod

HTTP 要求方法(GET、POST )。
此示例取值为 POST。

CanonicalURI

URI 参数,API 3.0 固定为正斜杠(/)。

CanonicalQueryString

发起 HTTP 要求 URL 中的查询字符串,对付 POST 要求,固定为空字符串"",对付 GET 要求,则为 URL 中问号(?)后面的字符串内容,例如:Limit=10&Offset=0。
把稳:CanonicalQueryString 须要参考 RFC3986 进行 URLEncode,字符集 UTF8,推举利用编程措辞标准库,所有分外字符均需编码,大写形式。

CanonicalHeaders

参与署名的头部信息,至少包含 host 和 content-type 两个头部,也可加入自定义的头部参与署名以提高自身要求的唯一性和安全性。
拼接规则:头部 key 和 value 统一转成小写,并去掉首尾空格,按照 key:value\n 格式拼接;多个头部,按照头部 key(小写)的 ASCII 升序进行拼接。
此示例打算结果是 content-type:application/json; charset=utf-8\nhost:cvm.tencentcloudapi.com\n。
把稳:content-type 必须和实际发送的相符合,有些编程措辞网络库纵然未指定也会自动添加 charset 值,如果署名时和发送时不一致,做事器会返回署名校验失落败。

SignedHeaders

参与署名的头部信息,解释这次要求有哪些头部参与了署名,和 CanonicalHeaders 包含的头部内容是逐一对应的。
content-type 和 host 为必选头部。
拼接规则:头部 key 统一转成小写;多个头部 key(小写)按照 ASCII 升序进行拼接,并且以分号(;)分隔。
此示例为 content-type;host

HashedRequestPayload

要求正文(Requestpayload,即 body,此示例为 {"Limit": 1, "Filters": [{"Values": ["\u672a\u547d\u540d"], "Name": "instance-name"}]})的哈希值,打算伪代码为 Lowercase(HexEncode(Hash.SHA256(RequestPayload))),即对 HTTP 要求正文做 SHA256 哈希,然后十六进制编码,末了编码串转换成小写字母。
对付 GET 要求,RequestPayload 固定为空字符串。
此示例打算结果是 35e9c5b0e3ae67532d3c9f17ead6c90222632e5b1ff7f6e89887f1398934f064。

根据以上规则,示例中得到的规范要求串如下:

POST/content-type:application/json; charset=utf-8host:cvm.tencentcloudapi.comcontent-type;host35e9c5b0e3ae67532d3c9f17ead6c90222632e5b1ff7f6e89887f1398934f0642. 拼接待署名字符串

按如下格式拼接待署名字符串:

StringToSign = Algorithm + \n + RequestTimestamp + \n + CredentialScope + \n + HashedCanonicalRequest

字段名称

阐明

Algorithm

署名算法,目前固定为 TC3-HMAC-SHA256。

RequestTimestamp

要求韶光戳,即要求头部的公共参数 X-TC-Timestamp 取值,取当前韶光 UNIX 韶光戳,精确到秒。
此示例取值为 1551113065。

CredentialScope

凭据范围,格式为 Date/service/tc3_request,包含日期、所要求的做事和终止字符串(tc3_request)。
Date 为 UTC 标准韶光的日期,取值须要和公共参数 X-TC-Timestamp 换算的 UTC 标准韶光日期同等;service 为产品名,必须与调用的产品域名同等。
此示例打算结果是 2019-02-25/cvm/tc3_request。

HashedCanonicalRequest

前述步骤拼接所得规范要求串的哈希值,打算伪代码为 Lowercase(HexEncode(Hash.SHA256(CanonicalRequest)))。
此示例打算结果是 5ffe6a04c0664d6b969fab9a13bdab201d63ee709638e2749d62a09ca18d7031。

把稳

Date 必须从韶光戳 X-TC-Timestamp 打算得到,且时区为 UTC+0。
如果加入系统本地时区信息,例如东八区,将导致白天和晚上调用成功,但是凌晨时调用必定失落败。
假设韶光戳为 1551113065,在东八区的韶光是 2019-02-26 00:44:25,但是打算得到的 Date 取 UTC+0 的日期应为 2019-02-25,而不是 2019-02-26。
Timestamp 必须是当前系统韶光,且需确保系统韶光和标准韶光是同步的,如果相差超过五分钟则必定失落败。
如果永劫光反面标准韶光同步,可能导致运行一段韶光后,要求必定失落败,返回署名过期缺点。

根据以上规则,示例中得到的待署名字符串如下:

TC3-HMAC-SHA25615511130652019-02-25/cvm/tc3_request5ffe6a04c0664d6b969fab9a13bdab201d63ee709638e2749d62a09ca18d70313. 打算署名(伪代码)

SecretKey = "Gu5t9xGAREXAMPLE"byte[] secretDate = hmac256(("TC3" + SecretKey).getBytes(UTF8), date);byte[] secretService = hmac256(secretDate, service);byte[] secretSigning = hmac256(secretService, "tc3_request");String signature = DatatypeConverter.printHexBinary(hmac256(secretSigning, stringToSign)).toLowerCase();System.out.println(signature);

派生出的密钥 SecretDate、SecretService 和 SecretSigning 是二进制的数据,可能包含不可打印字符,此处不展示中间结果。

字段名称

阐明

SecretKey

原始的 SecretKey,即 Gu5t9xGAREXAMPLE。

date

即 Credential 中的 Date 字段信息。
此示例取值为 2019-02-25。

service

即 Credential 中的 Service 字段信息。
此示例取值为 cvm

此示例打算结果是 72e494ea8a96525168。

4. 拼接 Authorization

按如下格式拼接 Authorization:

String Authorization = Algorithm + ' ' + 'Credential=' + SecretId + '/' + CredentialScope + ', ' + 'SignedHeaders=' + SignedHeaders + ', ' + 'Signature=' + Signature

字段名称

阐明

Algorithm

署名方法,固定为 TC3-HMAC-SHA256。

SecretId

密钥对中的 SecretId,即 AKIDz8krbsJ5mLPx3EXAMPL。

CredentialScope

见上文,凭据范围。
此示例打算结果是 2019-02-25/cvm/tc3_request。

SignedHeaders

见上文,参与署名的头部信息。
此示例取值为 content-type;host。

Signature

署名值。
此示例打算结果是 72e494ea8a96525168。

根据以上规则,示例中得到的值为:

TC3-HMAC-SHA256 Credential=AKIDz8krbsJ5mLPx3EXAMPL/2019-02-25/cvm/tc3_request, SignedHeaders=content-type;host, Signature=72e494ea8a96525168

终极完全的调用信息如下:

POST https://cvm.tencentcloudapi.com/Authorization: TC3-HMAC-SHA256 Credential=AKIDz8krbsJ5mLPx3EXAMPL/2019-02-25/cvm/tc3_request, SignedHeaders=content-type;host, Signature=72e494ea8a96525168Content-Type: application/json; charset=utf-8Host: cvm.tencentcloudapi.comX-TC-Action: DescribeInstancesX-TC-Version: 2017-03-12X-TC-Timestamp: 1551113065X-TC-Region: ap-guangzhou{"Limit": 1, "Filters": [{"Values": ["\u672a\u547d\u540d"], "Name": "instance-name"}]}5. API 3.0 署名 V3示例

import java.nio.charset.Charset;import java.nio.charset.StandardCharsets;import java.security.MessageDigest;import java.text.SimpleDateFormat;import java.util.Date;import java.util.TimeZone;import java.util.TreeMap;import javax.crypto.Mac;import javax.crypto.spec.SecretKeySpec;import javax.xml.bind.DatatypeConverter;public class TencentCloudAPITC3Demo { private final static Charset UTF8 = StandardCharsets.UTF_8; private final static String SECRET_ID = "AKIDz8krbsJ5mLPx3EXAMPL"; private final static String SECRET_KEY = "Gu5t9xGAREXAMPLE"; private final static String CT_JSON = "application/json; charset=utf-8"; public static byte[] hmac256(byte[] key, String msg) throws Exception { Mac mac = Mac.getInstance("HmacSHA256"); SecretKeySpec secretKeySpec = new SecretKeySpec(key, mac.getAlgorithm()); mac.init(secretKeySpec); return mac.doFinal(msg.getBytes(UTF8)); } public static String sha256Hex(String s) throws Exception { MessageDigest md = MessageDigest.getInstance("SHA-256"); byte[] d = md.digest(s.getBytes(UTF8)); return DatatypeConverter.printHexBinary(d).toLowerCase(); } public static void main(String[] args) throws Exception { String service = "cvm"; String host = "cvm.tencentcloudapi.com"; String region = "ap-guangzhou"; String action = "DescribeInstances"; String version = "2017-03-12"; String algorithm = "TC3-HMAC-SHA256"; String timestamp = "1551113065"; //String timestamp = String.valueOf(System.currentTimeMillis() / 1000); SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); // 把稳时区,否则随意马虎出错 sdf.setTimeZone(TimeZone.getTimeZone("UTC")); String date = sdf.format(new Date(Long.valueOf(timestamp + "000"))); // 步骤 1:拼接规范要求串 String httpRequestMethod = "POST"; String canonicalUri = "/"; String canonicalQueryString = ""; String canonicalHeaders = "content-type:application/json; charset=utf-8\n" + "host:" + host + "\n"; String signedHeaders = "content-type;host"; String payload = "{\"Limit\": 1, \"Filters\": [{\"Values\": [\"\\u672a\\u547d\\u540d\"], \"Name\": \"instance-name\"}]}"; String hashedRequestPayload = sha256Hex(payload); String canonicalRequest = httpRequestMethod + "\n" + canonicalUri + "\n" + canonicalQueryString + "\n" + canonicalHeaders + "\n" + signedHeaders + "\n" + hashedRequestPayload; System.out.println(canonicalRequest); // 步骤 2:拼接待署名字符串 String credentialScope = date + "/" + service + "/" + "tc3_request"; String hashedCanonicalRequest = sha256Hex(canonicalRequest); String stringToSign = algorithm + "\n" + timestamp + "\n" + credentialScope + "\n" + hashedCanonicalRequest; System.out.println(stringToSign); // 步骤 3:打算署名 byte[] secretDate = hmac256(("TC3" + SECRET_KEY).getBytes(UTF8), date); byte[] secretService = hmac256(secretDate, service); byte[] secretSigning = hmac256(secretService, "tc3_request"); String signature = DatatypeConverter.printHexBinary(hmac256(secretSigning, stringToSign)).toLowerCase(); System.out.println(signature); // 步骤 4:拼接 Authorization String authorization = algorithm + " " + "Credential=" + SECRET_ID + "/" + credentialScope + ", " + "SignedHeaders=" + signedHeaders + ", " + "Signature=" + signature; System.out.println(authorization); TreeMap<String, String> headers = new TreeMap<String, String>(); headers.put("Authorization", authorization); headers.put("Content-Type", CT_JSON); headers.put("Host", host); headers.put("X-TC-Action", action); headers.put("X-TC-Timestamp", timestamp); headers.put("X-TC-Version", version); headers.put("X-TC-Region", region); StringBuilder sb = new StringBuilder(); sb.append("curl -X POST https://").append(host) .append(" -H \"Authorization: ").append(authorization).append("\"") .append(" -H \"Content-Type: application/json; charset=utf-8\"") .append(" -H \"Host: ").append(host).append("\"") .append(" -H \"X-TC-Action: ").append(action).append("\"") .append(" -H \"X-TC-Timestamp: ").append(timestamp).append("\"") .append(" -H \"X-TC-Version: ").append(version).append("\"") .append(" -H \"X-TC-Region: ").append(region).append("\"") .append(" -d '").append(payload).append("'"); System.out.println(sb.toString()); }}2. 获取 API 3.0 V1 版本署名

署名方法 v1 大略易用,但是功能和安全性都不如署名方法 v3,推举利用署名方法 v3。

把稳

首次打仗,建议利用 API Explorer 中的“署名串天生”功能,选择署名版本为“ API 3.0 署名 v1 ”,可以天生署名过程进行验证,并供应了部分编程措辞的署名示例,也可直接天生 SDK 代码。
推举利用腾讯云 API 配套的 7 种常见的编程措辞 SDK,已经封装了署名和要求过程,均已开源,支持 Python、Java、PHP、Go、NodeJS、.NET、C++。

以云做事器查看实例列表(DescribeInstances)要求为例,当用户调用这一接口时,其要求参数可能如下:

参数名称

中文

参数值

Action

方法名

DescribeInstances

SecretId

密钥 ID

AKIDz8krbsJ5mLPx3EXAMPL

Timestamp

当前韶光戳

1465185768

Nonce

随机正整数

11886

Region

实例所在区域

ap-guangzhou

InstanceIds.0

待查询的实例 ID

ins-09dx96dg

Offset

偏移量

0

Limit

最大许可输出

20

Version

接口版本号

2017-03-12

1. 对参数排序

首先对所有要求参数按参数名的字典序( ASCII 码)升序排序。

把稳

只按参数名进行排序,参数值保持对应即可,不参与频年夜小。
按 ASCII 码频年夜小,如 InstanceIds.2 要排在 InstanceIds.12 后面,不是按字母表,也不是按数值。
用户可以借助编程措辞中的干系排序函数来实现这一功能,如 PHP 中的 ksort 函数。

上述示例参数的排序结果如下:

{ 'Action' : 'DescribeInstances', 'InstanceIds.0' : 'ins-09dx96dg', 'Limit' : 20, 'Nonce' : 11886, 'Offset' : 0, 'Region' : 'ap-guangzhou', 'SecretId' : 'AKIDz8krbsJ5mLPx3EXAMPL', 'Timestamp' : 1465185768, 'Version': '2017-03-12',}

利用程序设计措辞开拓时,可对上面示例中的参数进行排序,得到的结果同等即可。

2. 拼接规范要求串

此步骤天生要求字符串。
将把上一步排序好的要求参数格式化成“参数名称=参数值”的形式,如对 Action 参数,其参数名称为 " Action " ,参数值为 " DescribeInstances " ,因此格式化后就为 Action=DescribeInstances 。

把稳

“参数值”为原始值而非 url 编码后的值。

然后将格式化后的各个参数用"&"拼接在一起,最终生成的要求字符串为:

Action=DescribeInstances&InstanceIds.0=ins-09dx96dg&Limit=20&Nonce=11886&Offset=0&Region=ap-guangzhou&SecretId=AKIDz8krbsJ5mLPx3EXAMPL&Timestamp=1465185768&Version=2017-03-123. 拼接待署名字符串

此步骤天生署名原笔墨符串。
署名原笔墨符串由以下几个参数构成:

要求方法:支持 POST 和 GET 办法,这里利用 GET 要求,把稳方法为整年夜写。
要求主机:查看实例列表(DescribeInstances)的要求域名为 cvm.tencentcloudapi.com 。
实际的要求域名根据接口所属模块的不同而不同,详见各接口解释。
要求路径:当前版本云 API 的要求路径固定为 / 。
要求字符串:即上一步天生的要求字符串。

署名原文串的拼接规则为:要求方法 + 要求主机 +要求路径 + ? + 要求字符串。

示例的拼接结果为:

GETcvm.tencentcloudapi.com/?Action=DescribeInstances&InstanceIds.0=ins-09dx96dg&Limit=20&Nonce=11886&Offset=0&Region=ap-guangzhou&SecretId=AKIDz8krbsJ5mLPx3EXAMPL&Timestamp=1465185768&Version=2017-03-124. 打算署名(伪代码)

此步骤天生署名串。
首先利用 HMAC-SHA1 算法对上一步中得到的署名原笔墨符串进行署名,然后将天生的署名串利用 Base64 进行编码,即可得到终极的署名串。

import javax.crypto.Mac;import javax.crypto.SecretKey;import javax.crypto.spec.SecretKeySpec;import org.apache.commons.codec.binary.Base64;/ [Hmac-SHA1 署名算法] @String encryptText [加密字符源串] @String encryptKey [加密密钥] @return [署名值] /public class HmacSHA1 { private static final String MAC_NAME = "HmacSHA1"; public static final String ENCODING = "UTF-8"; //署名方法 public static String HmacSHA1Encrypt(String s,String secret_key ) throws Exception{ byte[] data = encryptKey.getBytes( ENCODING ); SecretKey secretKey = new SecretKeySpec( data, MAC_NAME ); Mac mac = Mac.getInstance( MAC_NAME ); mac.init( secretKey ); byte[] text = encryptText.getBytes( ENCODING ); byte[] digest = mac.doFinal( text ); return new String(Base64.encodeBase64(digest)); }}String secret_key = "Gu5t9xGAREXAMPLE";String s = "GETcvm.tencentcloudapi.com/?Action=DescribeInstances&InstanceIds.0=ins-09dx96dg&Limit=20&Nonce=11886&Offset=0&Region=ap-guangzhou&SecretId=AKIDz8krbsJ5mLPx3EXAMPL&Timestamp=1465185768&Version=2017-03-12";//终极署名串String Signature = new HmacSHA1();System.out.println(Signature)5. 获取调用信息并发送要求

# 实际调用,成功后可能如果是消费接口会产生计费(此处以Python措辞为例发送get要求)resp = requests.get("https://" + endpoint, params=data)print(resp.url)

终极得到的要求串为:

https://cvm.tencentcloudapi.com/?Action=DescribeInstances&InstanceIds.0=ins-09dx96dg&Limit=20&Nonce=11886&Offset=0&Region=ap-guangzhou&SecretId=AKIDz8krbsJ5mLPx3EXAMPL&Signature=EliP9YW3pW28FpsEdkXt%2F%2BWcGeI%3D&Timestamp=1465185768&Version=2017-03-12

字段名称

阐明

endpoint

做事地址, 例如:cvm.tencentcloudapi.com

data

API 3.0 署名 V1 所举示例接口参数,把稳 这里须要将打算的署名已键值对的形式加入data中

把稳

由于示例中的密钥是虚构的,韶光戳也不是系统当前韶光,因此如果将此 url 在浏览器中打开或者用 curl 等命令调用时会返回鉴权缺点:署名过期。
为了得到一个可以正常返回的 url ,须要修正示例中的 SecretId 和 SecretKey 为真实的密钥,并利用系统当前韶光戳作为 Timestamp。

为了更清楚的阐明署名过程,下面以 Java 措辞为例,将上述的署名过程详细实现。
要求的域名、调用的接口和参数的取值都以上述署名过程为准,代码只为阐明署名过程,并不具备通用性,实际开拓请只管即便利用 SDK 。

6. 署名串编码

天生的署名串并不能直接作为要求参数,须要对其进行 URL 编码。

如上一步天生的署名串为 ElicGeI= ,终极得到的署名串要求参数(Signature)为:EliPeI%3d,它将用于天生终极的要求 URL。

把稳

如果用户的要求方法是 GET,或者要求方法为 POST 同时 Content-Type 为 application/x-www-form-urlencoded,则发送要求时所有要求参数的值均须要做 URL 编码,参数键和=符号不须要编码。
非 ASCII 字符在 URL 编码前须要先以 UTF-8 进行编码。
有些编程措辞的网络库会自动为所有参数进行 urlencode,在这种情形下,就不须要对署名串进行 URL 编码了,否则两次 URL 编码会导致署名失落败。
其他参数值也须要进行编码,编码采取 RFC 3986。
利用 %XY 对分外字符例如汉字进行百分比编码,个中“ X ”和“ Y ”为十六进制字符(0-9 和大写字母 A-F),利用小写将引发缺点。

7. API 3.0 署名 V1示例

import java.io.UnsupportedEncodingException;import java.net.URLEncoder;import java.util.Random;import java.util.TreeMap;import javax.crypto.Mac;import javax.crypto.spec.SecretKeySpec;import javax.xml.bind.DatatypeConverter;public class TencentCloudAPIDemo { private final static String CHARSET = "UTF-8"; public static String sign(String s, String key, String method) throws Exception { Mac mac = Mac.getInstance(method); SecretKeySpec secretKeySpec = new SecretKeySpec(key.getBytes(CHARSET), mac.getAlgorithm()); mac.init(secretKeySpec); byte[] hash = mac.doFinal(s.getBytes(CHARSET)); return DatatypeConverter.printBase64Binary(hash); } public static String getStringToSign(TreeMap<String, Object> params) { StringBuilder s2s = new StringBuilder("GETcvm.tencentcloudapi.com/?"); // 署名时哀求对参数进行字典排序,此处用TreeMap担保顺序 for (String k : params.keySet()) { s2s.append(k).append("=").append(params.get(k).toString()).append("&"); } return s2s.toString().substring(0, s2s.length() - 1); } public static String getUrl(TreeMap<String, Object> params) throws UnsupportedEncodingException { StringBuilder url = new StringBuilder("https://cvm.tencentcloudapi.com/?"); // 实际要求的url中对参数顺序没有哀求 for (String k : params.keySet()) { // 须要对要求串进行urlencode,由于key都是英笔墨母,故此处仅对其value进行urlencode url.append(k).append("=").append(URLEncoder.encode(params.get(k).toString(), CHARSET)).append("&"); } return url.toString().substring(0, url.length() - 1); } public static void main(String[] args) throws Exception { TreeMap<String, Object> params = new TreeMap<String, Object>(); // TreeMap可以自动排序 // 实际调用时应该利用随机数,例如:params.put("Nonce", new Random().nextInt(java.lang.Integer.MAX_VALUE)); params.put("Nonce", 11886); // 公共参数 // 实际调用时应该利用系统当前韶光,例如: params.put("Timestamp", System.currentTimeMillis() / 1000); params.put("Timestamp", 1465185768); // 公共参数 params.put("SecretId", "AKIDz8krbsJ5mLPx3EXAMPL"); // 公共参数 params.put("Action", "DescribeInstances"); // 公共参数 params.put("Version", "2017-03-12"); // 公共参数 params.put("Region", "ap-guangzhou"); // 公共参数 params.put("Limit", 20); // 业务参数 params.put("Offset", 0); // 业务参数 params.put("InstanceIds.0", "ins-09dx96dg"); // 业务参数 params.put("Signature", sign(getStringToSign(params), "Gu5t9xGAREXAMPLE", "HmacSHA1")); // 公共参数 System.out.println(getUrl(params)); }}API 2.0 署名

此署名现已不在掩护,建议利用性能更优的 API 3.0 署名,如需利用,请直接在 API Explorer 的 署名串天生 > 选择 API 2.0 署名版本进行操作。

署名失落败

存在以下署名失落败的缺点码,请根据实际情形处理。

缺点码

缺点描述

AuthFailure.SignatureExpire

署名过期。
Timestamp 与做事器吸收到要求的韶光相差不得超过五分钟。

AuthFailure.SecretIdNotFound

密钥不存在。
请到掌握台查看密钥是否被禁用,是否少复制了字符或者多了字符。

AuthFailure.SignatureFailure

署名缺点。
可能是署名打算缺点,或者署名与实际发送的内容不相符合,也有可能是密钥 SecretKey 缺点导致的。

AuthFailure.TokenFailure

临时证书 Token 缺点。

AuthFailure.InvalidSecretId

密钥造孽(不是云 API 密钥类型)。

返回结果精确返回结果

以云做事器的接口查看实例状态列表( DescribeInstancesStatus )2017-03-12版本为例,若调用成功,其可能的返回如下为:

{ "Response": { "TotalCount": 0, "InstanceStatusSet": [], "RequestId": "b5b41468-520d-4192-b42f-595cc34b6c1c" }}Response 及其内部的 RequestId 是固定的字段,无论要求成功与否,只要 API 处理了,则必定会返回。
RequestId 用于一个 API 要求的唯一标识,如果 API 涌现非常,可以联系我们,并供应该 ID 来办理问题。
除了固定的字段外,别的均为详细接口定义的字段,不同的接口所返回的字段拜会接口文档中的定义。
此例中的 TotalCount 和 InstanceStatusSet 均为 DescribeInstancesStatus 接口定义的字段,由于调用要求的用户暂时还没有云做事器实例,因此 TotalCount 在此情形下的返回值为 0, InstanceStatusSet 列表为空。
缺点返回结果

若调用失落败,其返回值示例如下为:

{ "Response": { "Error": { "Code": "AuthFailure.SignatureFailure", "Message": "The provided credentials could not be validated. Please check your signature is correct." }, "RequestId": "ed93f3cb-f35e-473f-b9f3-0d451b8b79c6" }}Error 的涌当代表着该要求调用失落败。
Error 字段连同其内部的 Code 和 Message 字段在调用失落败时是必定返回的。
Code 表示详细出错的缺点码,当要求出错时可以先根据该缺点码在公共缺点码和当前接口对应的缺点码列表里面查找对应缘故原由和解决方案。
Message 显示出了这个缺点发生的详细缘故原由,随着业务发展或体验优化,此文本可能会常常保持变更或更新,用户不应依赖这个返回值。
RequestId 用于一个 API 要求的唯一标识,如果 API 涌现非常,可以联系我们,并供应该 ID 来办理问题。
公共缺点码

返回结果中如果存在 Error 字段,则表示调用 API 接口失落败。
Error 中的 Code 字段表示缺点码,所有业务都可能涌现的缺点码为公共缺点码,下表列出了公共缺点码。

缺点码

缺点描述

AuthFailure.InvalidSecretId

密钥造孽(不是云 API 密钥类型)。

AuthFailure.MFAFailure

MFA 缺点。

AuthFailure.SecretIdNotFound

密钥不存在。

AuthFailure.SignatureExpire

署名过期。

AuthFailure.SignatureFailure

署名缺点。

AuthFailure.TokenFailure

token 缺点。

AuthFailure.UnauthorizedOperation

要求未 CAM 授权。

DryRunOperation

DryRun 操作,代表要求将会是成功的,只是多传了 DryRun 参数。

FailedOperation

操作失落败。

InternalError

内部缺点。

InvalidAction

接口不存在。

InvalidParameter

参数缺点。

InvalidParameterValue

参数取值缺点。

LimitExceeded

超过配额限定。

MissingParameter

短缺参数缺点。

NoSuchVersion

接口版本不存在。

RequestLimitExceeded

要求的次数超过了频率限定。

ResourceInUse

资源被占用。

ResourceInsufficient

资源不敷。

ResourceNotFound

资源不存在。

ResourceUnavailable

资源不可用。

UnauthorizedOperation

未授权操作。

UnknownParameter

未知参数缺点。

UnsupportedOperation

操作不支持。

UnsupportedProtocol

HTTPS 要求方法缺点,只支持 GET 和 POST 要求。

UnsupportedRegion

接口不支持所传地域。

小伙伴们有兴趣想理解内容和更多干系学习资料的请点赞收藏+评论转发+关注我,后面会有很多干货。
我有一些口试题、架构、设计类资料可以说是程序员口试必备!
所有资料都整理到网盘了,须要的话欢迎下载!
私信我回答【111】即可免费获取

出处:https://cloud.tencent.com/document/product/1278/46713

标签:

相关文章

今日头条算法如何打造个化推荐系统

信息爆炸的时代已经到来。人们每天都要面对海量的信息,如何在海量信息中找到自己感兴趣的内容,成为了许多人关注的焦点。今日头条作为一款...

网站建设 2025-01-31 阅读1 评论0