阿里云人脸对比签名算法

签名算法

步骤1:创建标准请求串并加密

首先要将请求按照下面的固定形式进行拼接,生成标准请求串。示例伪代码

CanonicalRequest=HTTPRequestMethod+' '+CanonicalURI+' '+(CanonicalQueryStringor'')+' '+CanonicalHeaders+' '+SignedHeaders+' '+Lowercase(HexEncode(Hash(RequestPayloador'')))在此伪代码中:

HTTPRequestMethod即HTTP协议请求方式,如POST、GET等,使用全大写字母表示。

CanonicalURI即URI编码后的请求路径。

CanonicalQueryString为请求查询字符串。要构建规范查询字符串,首先按字符代码对参数名按升序进行排序,如果重复名称的参数再按值升序进行排序。然后对每个参数名称和值分别进行URI编码(请不要重复编码)。接着通过从排序列表中的第一个参数名称开始构建规范查询字符串。对于每个参数,附加URI编码的参数名称,后跟等号字符(=),后跟URI编码的参数值对没有值的参数使用空字符串。在每个参数值之后附加符号,除了列表中的最后一个值。

要创建规范HTTP请求头列表,请将所有HTTP头名称转换为小写(请保证请求头名称不能包含空格),并删除请求头value中前导空格和尾随空格。通过用字符代码升序对请求头进行排序,然后遍历请求头名称来构建规范HTTP请求头列表。注意:x-cloud-date(遵循ISO8601标准,使用UTC时间,格式为YYYYMMDDTHHmmssZ),x-cloud-nonce必须在请求中包含并且参与签名;如果有x-cloud-security-token头,此项也必须参与签名。

CanonicalHeaders表示需要参与签名的请求头及值,使用:分隔名称和值,并添加换行符。SignedHeaders用于告知阿里云,请求头中的哪些是签名过程的一部分。

最后,需要把请求体中的payload做SHA256哈希后,表示为小写十六进制字符串。如果有效负载为空,则使用空字符串作为Hash函数的输入。

POST示例请求

POST/v1/regions/cn-north-1/instancescontent-type:application/jsonhost:vm.cloud-api.comx-cloud-date:20180404T034307Zx-cloud-nonce:ed558a3b-9808-4edb-8597-187bda63a4f2content-type;host;x-cloud-date;x-cloud-nonceeadd64d9bd63436404495b9a2cd0a5b4c59b01332a88d81da27815824b3c4280GET示例请求$xsltGET/v1/regions/cn-north-1/metrics/cpu_util/metricDataserviceCode=vmstartTime=2018-04-04T06%3A01%3A46Zcontent-type:application/jsonhost:vm.cloud-api.comx-cloud-date:20180404T061302Zx-cloud-nonce:ed558a3b-9808-4edb-8597-187bda63a4f2content-type;host;x-cloud-date;x-cloud-nonceeadd64d9bd63436404495b9a2cd0a5b4c59b01332a88d81da27815824b3c4280

签名步骤2:生成待签名字符串

要创建字符串进行签名,请连接规则请求的算法,日期和时间,凭据范围和摘要,如以下伪代码所示:

$xsltStringToSign=Algorithm+ +RequestDateTime+ +CredentialScope+ +Lowercase(HexEncode(Hash(CanonicalRequest)))其中,

Algorithm固定为JDCLOUD2-HMAC-SHA256是算法。

RequestDateTime与HTTP请求头x-cloud-date中的格式和值必须完全一致。

CredentialScope格式为”{时间}/{地域编码}/{产品线}/cloud2_request”,例如20180130/cn-north-1/vpc/cloud2_request

Lowercase(HexEncode(CanonicalRequest))是步骤1生成的标准请求进行SHA256哈希后,在表示为小写十六进制字符串。

例如:

$xsltJDCLOUD2-HMAC-SHA25620180404T061302Z20180404/cn-north-1/monitor/cloud2_request5d7d08a5b792a63ad0bd820cff95ff41c6dbcf4bd7bae9e371be0ff891740ee7##

签名步骤3:计算签名

计算的伪代码

$xsltkSecret=阿里云AccessKeySecretkDate=HMAC("JDCLOUD2"+kSecret,Date)kRegion=HMAC(kDate,Region)kService=HMAC(kRegion,Service)kSigning=HMAC(kService,"cloud2_request")其中HMAC(key,data)代表以二进制格式返回输出的HMAC-SHA256函数。散列过程中使用的日期格式为YYYYMMDD,值必须与x-cloud-date中保持一致。Region表示地域编码,Service表示产品线名称。

使用生成的kSigning再对步骤2得到的待签名字符串进行HMAC运算,并将计算结果转为小写十六进制字符串:

$xsltsignResult=Lowercase(HexEncode(HMAC(kSigning,StringToSign)))最终生成一个签名串,如:9b2026198d3acbf99da395e23a994ed369a0d70f5b4a5d7567dd0caf3009656d

签名步骤4:向请求中添加签名信息

计算签名后,需要将签名的结果作为Authorization请求头将其添加到请求中。

Authorization的格式为JDCLOUD2-HMAC-SHA256Credential={AccessKey}/{Date}/{Region}/{Service}/cloud2_request,SignedHeaders={SignedHeaders},Signature={signResult}

以curl命令调用方式的例子:

$xsltcurl-XGET-H"x-cloud-date:20180404T061302Z"-H"x-cloud-nonce:ed558a3b-9808-4edb-8597-187bda63a4f2"-H"Authorization:JDCLOUD2-HMAC-SHA256Credential=C61249XXXXXXXXXXXXXXXXXX/20180404/cn-north-1/monitor/cloud2_request,SignedHeaders=content-type;host;x-cloud-date;x-cloud-nonce,Signature=9b2026198d3acbf99da395e23a994ed369a0d70f5b4a5d7567dd0caf3009656d"-H"Content-Type:application/json""http://vm.cloud-api.com/v1/regions/cn-north-1/metrics/cpu_util/metricData?serviceCode=vmstartTime=2018-04-04T06:01:46Z"签名步骤示例

假设用户签名的输入信息为:

$xsltAccessKey:'TESTAK'AccessKeySecret:'TESTSK'Date:'20190214T104514Z'Region:'cn-north-1'Service:'test'请求地址和路径:'http://test.cloud-api.com/v1/resource:action?p1=p1p0=p0o=%u=u'参与签名的请求头:'x-cloud-date'='20190214T104514Z','x-cloud-nonce'='testnonce','x-my-header'='test','x-my-header_blank'='blank'请求地址和路径:'http://test.cloud-api.com/v1/resource:action?p1=p1p0=p0o=%u=u'请求体为:'bodydata'步骤1的结果应该为:$xsltPOST/v1/resource%3Aactiono=%25p0=p0p1=p1u=ux-cloud-date:20190214T104514Zx-cloud-nonce:testnoncex-my-header:testx-my-header_blank:blankx-cloud-date;x-cloud-nonce;x-my-header;x-my-header_blanke51832a118eeff7ad976d635b7d04538e362e4c21bd0f6253580b0a83a209074步骤2的结果应该为:$xsltJDCLOUD2-HMAC-SHA25620190214T104514Z20190214/cn-north-1/test/cloud2_requestfb2e317056269590681d091f8eb22272967c0b922b2deda887312215ea4eed4c步骤3的结果应该为:$xslt(注意:kDate、kRegion、kService、kSigning应该是二进制格式的结果,下面展示的是转化为16进制字符串展示后的结果。这个只是为了页面展示目的,实际签名过程中,16进制的转化结果绝对不要作为下一步的输入,请使用原始二进制格式数据。)kDate=dbbdee87f18afeedd6456923587f5323b90c3a77fbc6e381b243c90c672d5dafkRegion=78e1da51757851329da8e31a6bad9f509c4816cacb8d5b2b9d171e49498ce4b6kService=44050ec21c8e839f36ff5b2d44ec4a5876f4ffd6ef9a7a692a3eba40396bdb68kSigning=a4e50bcb6001be0008696b173c30172b5ce22a77db00d21c6a9d69de2ba33b7dsignResult=2a98f83c074e7bee260bfc8ef64f009c07595bd93f7f0c3f4e156bf6479ed9bf

步骤4的结果应该为:

$xsltJDCLOUD2-HMAC-SHA256Credential=TESTAK/20190214/cn-north-1/test/cloud2_request,SignedHeaders=x-cloud-date;x-cloud-nonce;x-my-header;x-my-header_blank,Signature=2a98f83c074e7bee260bfc8ef64f009c07595bd93f7f0c3f4e156bf6479ed9bf