我正在关注this amazon documentation,试图找到在javascript中生成签名的算法。我似乎无法让它发挥作用。
// html
// <head>
<script src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/3.1.9-1/core.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/3.1.9-1/sha256.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/3.1.9-1/hmac.min.js"></script>
// body (javascript)
var test_string = "GET\nwebservices.amazon.com\n/onca/xml\nAWSAccessKeyId=AKIAIOSFODNN7EXAMPLE&AssociateTag=mytag-20&ItemId=0679722769&Operation=ItemLookup&ResponseGroup=Images%2CItemAttributes%2COffers%2CReviews&Service=AWSECommerceService&Timestamp=2014-08-18T12%3A00%3A00Z&Version=2013-08-01"
var signature2 = CryptoJS.HmacSHA256(test_string, "1234567890");
console.log(signature2.toString());
我得到8fb6d93342d767d797799aee4ea5a6d8322f0d8554537c313cfa69fa25f1cd07
我应该得到j7bZM0LXZ9eXeZruTqWm2DIvDYVUU3wxPPpp+iXxzQc=
嗯,有谁知道什么是错的?
答案 0 :(得分:2)
没有错,只是你得到的字符串代表一个字节数组(带有十六进制表示)。所以你需要做的就是Base 64编码这个字节数组,你将得到完全相同的结果。在这里查看它,粘贴你的十六进制表示的字节数组和base 64编码:http://tomeko.net/online_tools/hex_to_base64.php?lang=en
至于如何做到这一点,您可以查看this question或this one。
更新:
正如评论中所指出的,似乎在cryptojs中有一种内置方式可以直接转换为base64:
console.log(signature2.toString(CryptoJS.enc.Base64));
答案 1 :(得分:1)
Not(in=sel, out=notsel);
And(a=notsel, b=in, out=a);
And(a=in, b=sel, out=b);
我在这里发布这个解决方案,因为我试图在ReactNative中完成相同的练习,而ReactNative不喜欢npm的基础加密包。 CryptoJS可以替代它。
注意:(这是令人愤怒的)我不得不摆脱第一个\ n,尽管亚马逊特别告诉你在行前面添加休息符号并且GET在他们的示例中有一个行空间。
完整解决方案:
let hash = CryptoJS.HmacSHA256(message, secret_key);
let result = CryptoJS.enc.Base64.stringify(hash);