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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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);

给输出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;
},'');

以上是关于Hmac在Google Apps脚本中登录,当Secret和Digest是base64编码时的主要内容,如果未能解决你的问题,请参考以下文章

Google Apps 脚本和 Cloudbuild CI 登录

如何调试Google Apps脚本(又名Logger.log登录到哪里?)

Google Apps 脚本 - 如何解析响应

从工作表中的 Google Apps 脚本访问 BigQuery 时需要登录错误

我是否需要更改我的Apps脚本代码,因为Google+登录功能已被弃用?

当 Zapier 添加一行时,Google Apps 脚本 onEdit 触发器未触发 [重复]