在CryptoJS中创建共享密钥签名失败

时间:2015-12-09 11:33:30

标签: javascript rest azure digital-signature cryptojs

我需要帮助为Azure存储REST创建共享密钥签名。

在chrome中,我可以输出我正在签名的字符串:

PUT


11

text/plain;charset=UTF-8






x-ms-blob-type:BlockBlob
x-ms-date:Wed, 09 Dec 2015 11:53:00 GMT
x-ms-version:2015-04-05
/myaccount/logs

使用Postman,服务器返回了以下内容:

<?xml version="1.0" encoding="utf-8"?>
<Error>
    <Code>AuthenticationFailed</Code>
    <Message>Server failed to authenticate the request. Make sure the value of Authorization header is formed correctly including the signature.
RequestId:6ca14d01-0001-00cb-5673-32e680000000
Time:2015-12-09T11:20:01.6093647Z</Message>
    <AuthenticationErrorDetail>The MAC signature found in the HTTP request 'O1Xwmg6TeU53qYoDiKQHgJZc+58uPaJPvotxXL116XQ=' is not the same as any computed signature. Server used following string to sign: 'PUT


11

text/plain;charset=UTF-8






x-ms-blob-type:BlockBlob
x-ms-date:Wed, 09 Dec 2015 11:53:00 GMT
x-ms-version:2015-04-05
/myaccount/logs'.</AuthenticationErrorDetail>
</Error>

正如您所看到的,两个签名字符串都是相同的。我检查过,两篇文章没有区别。

这是我执行生成签名的代码:

var accessKeyBytes = CryptoJS.enc.Base64.parse(base64EncodedSharedKey);
var encodedBits = CryptoJS.HmacSHA256(stringToSign, accessKeyBytes);
var result = CryptoJS.enc.Base64.stringify(encodedBits);
return result;

其中base64EncodedSharedKey是Azure存储的主键。

你有什么想法吗?我能做错什么?在形成要签名的JavaScript字符串时,我应该反斜杠吗?

1 个答案:

答案 0 :(得分:1)

解决。

问题是,在要签名的字符串的末尾,我放了一个\ n。

我不应该把回车放在字符串的末尾。