Hmac在Google Apps脚本中登录,当Secret和Digest是base64编码时

人生难得几回搏,此时不搏待何时。这篇文章主要讲述Hmac在Google Apps脚本中登录,当Secret和Digest是base64编码时相关的知识,希望能为你提供帮助。
在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);

【Hmac在Google Apps脚本中登录,当Secret和Digest是base64编码时】给输出bBLhyGY61BPEbPiFKknX1g9eXv9r98uvwwgVy7YMYDY=
我已经尝试了几个小时,我无法弄清楚如何在Google Apps脚本中复制此行为!
答案我从未成功地弄清楚如何使用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); }

另一答案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; },'');


    推荐阅读