开发者社区> 问答> 正文

调用API时,计算出的signature与预期不符

萌物 2016-02-17 20:56:40 1596

按照该文档方法编写测试代码https://help.aliyun.com/document_detail/dns/api-reference/call-method/signature.html?spm=5176.product9002830_dns.6.129.9Mrytq

我对于文档中的计算HMAC-SHA1部分有疑问
这部分代码如下(C/C++)

void AliSign(char *StringToSign, char *SignKey)
{
    char opad[64], ipad[64];
    sha1_context shactx;
    uint8 middata[20]; int i;

    memset(opad, 0, 64);
    strcpy(opad, SignKey);
    memset(ipad, 0, 64);
    strcpy(ipad, SignKey);

    for(i=0; i<64; i++)
        opad[i] ^= 0x5C,
        ipad[i] ^= 0x36;

    sha1_starts(&shactx);
    sha1_update(&shactx, (uint8*)ipad, 64);
    sha1_update(&shactx, (uint8*)StringToSign,
        strlen(StringToSign));
    sha1_finish(&shactx, middata);

    sha1_starts(&shactx);
    sha1_update(&shactx, (uint8*)opad, 64);
    sha1_update(&shactx, middata, 20);
    sha1_finish(&shactx, middata);

    base64_encode(middata, 20, StringToSign, 30);
}

API文档中给出如下示例

"GET&%2F&AccessKeyId%3Dtestid%26Action%3DDescribeDomainRecords%26Format%3Dxml%26DomainName%3Dexample.com%26SignatureMethod%3DHMAC-SHA1%26SignatureNonce%3D1324fd0e-e2bb-4bb1-917c-bd6e437f1710%26SignatureVersion%3D1.0%26TimeStamp%3D2014-08-15T11%253A10%253A07Z%26Version%3D2015-01-09"
密钥:testsecret&
加密结果:SmhZuLUnXmqxSEZ/GqyiwGqmf+M=

使用我自己的函数,加密结果为RExwPbJruipP6shxgJWNjhsXyzU=,
这个结果与其他在线hmac加密结果一致,但是与文档中给出的结果不符
这个网站是一个在线HMAC加密网站http://1024tools.com/hmac
其给出了Hex结果444c703db26bba2a4feac87180958d8e1b17cb35以base64格式编码即为RExwPbJruipP6shxgJWNjhsXyzU=

在实际运行中收到如下回复

<?xml version="1.0" encoding="UTF-8"?> <Error><RequestId>687820ED-F1DB-479C-97AB-AC8979A74CFF</RequestId><HostId>dns.aliyuncs.com</HostId><Code>SignatureDoesNotMatch</Code><Message>The signature we calculated does not match the one you provided. Please refer to the API reference about authentication for details.</Message><!--10.178.73.196--></Error>

我怀疑,API文档所介绍的签名方法有误

XML 网络协议 API 数据安全/隐私保护 iOS开发 数据格式 C++
分享到
取消 提交回答
全部回答(2)
添加回答

集结各类场景实战经验,助你开发运维畅行无忧

推荐文章
相似问题