【问题标题】:Calculate an RFC 2104-compliant HMAC with the SHA256 hash algorithm in ruby使用 ruby​​ 中的 SHA256 哈希算法计算符合 RFC 2104 的 HMAC
【发布时间】:2013-05-12 01:18:51
【问题描述】:

我正在浏览亚马逊产品广告 API REST signature docs,但我卡在了 #8

使用上面的字符串和我们的“虚拟”秘密访问密钥:1234567890,使用 SHA256 哈希算法计算符合 RFC 2104 的 HMAC。有关此步骤的更多信息,请参阅您的编程语言的文档和代码示例。

没关系,在Calculating a SHA hash with a string + secret key in python 的帮助下再次尝试了它。将在下面发布答案。

【问题讨论】:

    标签: ruby amazon amazon-product-api


    【解决方案1】:

    以下创建正确的签名:

    require 'openssl'
    
    secret_key = '1234567890'
    query = 'AWSAccessKeyId=AKIAIOSFODNN7EXAMPLE&ItemId=0679722769&Operation=ItemLookup&ResponseGroup=ItemAttributes%2COffers%2CImages%2CReviews&Service=AWSECommerceService&Timestamp=2009-01-01T12%3A00%3A00Z&Version=2009-01-06'
    data = ['GET', 'ecs.amazonaws.com', '/onca/xml', query].join("\n")
    sha256 = OpenSSL::Digest::SHA256.new
    sig = OpenSSL::HMAC.digest(sha256, secret_key, data)
    signature = Base64.encode64(sig)
    

    【讨论】:

    • 网址 webservices.amazon.com 已更改为 ecs.amazonaws.com,您必须对其进行更新才能生成有效签名。
    • @HippieBandJam 我假设您的意思只是网址,但您介意编辑我的答案吗?
    【解决方案2】:

    添加到 AJcodez 答案:

    我愿意:

    ...
    signature_raw = Base64.strict_encode64(sig)
    signature     = CGI::escape(signature_raw)
    

    encode64在末尾添加换行符,strict_encode64() 没有。

    https://stackoverflow.com/a/2621023/2760406

    亚马逊希望您“对签名中的加号 (+) 和等号 (=) 字符进行 URL 编码”#9 - 如果您不这样做,现在将无法使用。

    http://docs.aws.amazon.com/AWSECommerceService/latest/DG/rest-signature.html#rest_detailedexample

    【讨论】:

      【解决方案3】:

      您可以使用 cryptoJs 使用您的秘密访问密钥计算密钥哈希消息身份验证代码 (HMAC-SHA256) 签名

      首先通过键入在您的系统中本地安装cryptoJs

      npm install crypto-js
      

      要全局安装它,你需要在上面的命令中添加一个标志 -g。然后添加这段代码并运行它。

      var CryptoJS = require("crypto-js");
      
      // Calculate an RFC 2104-compliant HMAC with the SHA256 hash algorithm
      
      var exampleString = 
          "GET\n" +
          "webservices.amazon.com\n" +
          "/onca/xml\n" + 
          "AWSAccessKeyId=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 signature = CryptoJS.HmacSHA256(exampleString, "1234567890");
      
      console.log("test signature", signature.toString(CryptoJS.enc.Base64));
      

      【讨论】:

        猜你喜欢
        • 2017-08-19
        • 2016-08-03
        • 2020-11-27
        • 2014-01-14
        • 2010-11-17
        • 1970-01-01
        • 2016-06-23
        • 1970-01-01
        • 2016-08-20
        相关资源
        最近更新 更多