【问题标题】:Hmac Signing in Google Apps Script, When Secret and Digest are base64 encodedGoogle Apps 脚本中的 Hmac 签名,当 Secret 和 Digest 采用 base64 编码时
【发布时间】:2017-07-11 06:40:05
【问题描述】:

鉴于nodejs中的这段代码:

const crypto = require('crypto');
const message = 'message to sign';
const secret = 'mysecret';
const signature = crypto.createHmac('sha256', secret).update(message).digest('hex');
console.log(signature);

输出为40d4c57eed56968de0f3a22e73ebf8abc6ab4c38bba95fd2c85dd4dc90bf36b9

在答案here 的帮助下,我在 Google Apps 脚本中完全复制了这种行为,并使用了这个功能:

//conversion from byte array taken from: https://stackoverflow.com/a/27933459
function makeHmacSignature(macAlg, message, secret) {
  return Utilities.computeHmacSignature(macAlg, message, secret).reduce(function(str,chr){
    chr = (chr < 0 ? chr + 256 : chr).toString(16);
    return str + (chr.length==1?'0':'') + chr;
  },'');
}

但是,假设签名稍有改变,这样秘密是一个 base64 编码的字符串,我们希望得到 base64 中的摘要。在 nodejs 代码中,更改是微不足道的:

const crypto = require('crypto');
const message = 'message to sign';
const secret = 'mysecret';
const decodedSecret = Buffer(secret, 'base64');
const signature = crypto.createHmac('sha256', decodedSecret).update(message).digest('base64');
console.log(signature);

给出输出bBLhyGY61BPEbPiFKknX1g9eXv9r98uvwwgVy7YMYDY=

我已经尝试了几个小时,我无法弄清楚如何在 Google Apps 脚本中复制这种行为!

【问题讨论】:

    标签: javascript node.js google-apps-script base64 hmac


    【解决方案1】:

    Google Apps 脚本实际上为此提供了实用功能。

    见:https://developers.google.com/apps-script/reference/utilities/utilities#computehmacsha256signaturevalue-key

    所以不是

    const signature = crypto.createHmac('sha256', secret).update(message).digest('hex');
    

    你可以这样做:

    var byteSignature = Utilities.computeHmacSha256Signature(message, secret);
    // convert byte array to hex string
    var signature = byteSignature.reduce(function(str,chr){
      chr = (chr < 0 ? chr + 256 : chr).toString(16);
      return str + (chr.length==1?'0':'') + chr;
    },'');
    

    【讨论】:

      【解决方案2】:

      我从来没有成功地弄清楚如何完全使用 Google Apps Script 原生函数来做到这一点。

      我使用了jsSHA。我粘贴在optimized sha256.js 文件中,并通过该内联,使用上面的示例数据,此测试函数返回正确的输出:

      function testHmacSigs() {
        var message = 'message to sign';
        var secret = 'mysecret';
        var shaObj = new jsSHA("SHA-256", "TEXT");
        shaObj.setHMACKey(secret, "B64");
        shaObj.update(message);
        var sig = shaObj.getHMAC("B64");
      
        Logger.log(sig);
      }
      

      【讨论】:

      • 优化文件不存在。有没有更好的方法来找到它或得到它?不太懂javascript。
      猜你喜欢
      • 1970-01-01
      • 2023-02-08
      • 2022-10-18
      • 1970-01-01
      • 1970-01-01
      • 2020-09-06
      • 2016-07-13
      • 1970-01-01
      • 2018-10-16
      相关资源
      最近更新 更多