首页 > 解决方案 > 什么是相当于节点缓冲区对象的 Google Apps 脚本?

问题描述

Node.js小提琴

const crypto = require('crypto');

let secret = 'my_secret';
let message = 'my_message';

let signer = crypto.createHmac('sha512', secret)
const signature = signer.update(message).digest('base64');
console.log(signature); 
//signature = DWpafZMnI4PT5v0jdidFtU5qoh3fsvUKnaOga/Y2Nzy/tvsx1F9p61SjE+hlRQ97y/LMmBkG39IyL5Ja46bJlw==

// ***** Use Hex Buffer instead of string - same result
let message_buffer = Buffer.from(message); //<Buffer 6d 79 5f 6d 65 73 73 61 67 65>
let signer_from_buffer = crypto.createHmac('sha512', secret)
const signature_from_buffer = signer_from_buffer.update(message_buffer).digest('base64');
console.log(signature_from_buffer); 
// signature = DWpafZMnI4PT5v0jdidFtU5qoh3fsvUKnaOga/Y2Nzy/tvsx1F9p61SjE+hlRQ97y/LMmBkG39IyL5Ja46bJlw==

在 Google Apps 脚本中:

var secret =  'my_secret';
var message = 'my_message';

var signature_hash = Utilities.computeHmacSignature(Utilities.MacAlgorithm.HMAC_SHA_512, message, secret);
var signature = Utilities.base64Encode(signature_hash);
Logger.log(signature);
//signature = DWpafZMnI4PT5v0jdidFtU5qoh3fsvUKnaOga/Y2Nzy/tvsx1F9p61SjE+hlRQ97y/LMmBkG39IyL5Ja46bJlw==

// Use Hex Array instead of string - different result
var message_buffer = ["6d", "79", "5f", "6d", "65", "73", "73", "61", "67", "65"];
var signature_hash_from_buffer = Utilities.computeHmacSignature(Utilities.MacAlgorithm.HMAC_SHA_512, message_buffer , secret);
var signature_from_buffer = Utilities.base64Encode(signature_hash_from_buffer );
Logger.log(signature_from_buffer );
//signature_from_buffer = gGK0Y/KytE+8ZKWs/og1VQ1wMdPnoFmJMCHGpKdi+QODFwykqvDK5qJwgzZrr1b1g5050j9r8jpfXlM2ZA+3qQ==

所以我知道我的加密过程正常工作。问题是,我是从十六进制数组开始的,所以我希望能够得到相同的结果。我无法弄清楚节点缓冲区是什么类型的对象,以及如何将其转换为 Google Apps 脚本。

标签: node.jsgoogle-apps-scriptencryptionhexcryptojs

解决方案


我相信你的目标如下。

  • 您想使用 Google Apps 脚本进行检索DWpafZMnI4PT5v0jdidFtU5qoh3fsvUKnaOga/Y2Nzy/tvsx1F9p61SjE+hlRQ97y/LMmBkG39IyL5Ja46bJlw==["6d", "79", "5f", "6d", "65", "73", "73", "61", "67", "65"]

在 Google Apps 脚本中,getBytes()返回 Int8Array,它是一个二进制补码 8 位有符号整数数组。所以在这种情况下,首先需要将 from 转换["6d", "79", "5f", "6d", "65", "73", "73", "61", "67", "65"]为 Int8Array。而当字节数组用于 时Utilities.computeHmacSignaturesecret也需要转换为字节数组。关于这一点,TheMaster的回答已经提到了。参考

以上几点反映到 Google Apps Script 中,变成如下。

示例脚本:

function myFunction() {
  var secret =  'my_secret';
  var message_buffer = ["6d", "79", "5f", "6d", "65", "73", "73", "61", "67", "65"];
  
  // Convert message_buffer (Unsigned hexadecimal array) to Int8Array.
  var message = message_buffer.map(e => parseInt(e[0], 16).toString(2).length == 4 ? parseInt(e, 16) - 256: parseInt(e, 16));
  
  var signature_hash = Utilities.computeHmacSignature(Utilities.MacAlgorithm.HMAC_SHA_512, message, Utilities.newBlob(secret).getBytes());
  var signature = Utilities.base64Encode(signature_hash);
  Logger.log(signature);
  // DWpafZMnI4PT5v0jdidFtU5qoh3fsvUKnaOga/Y2Nzy/tvsx1F9p61SjE+hlRQ97y/LMmBkG39IyL5Ja46bJlw==
}

其他图案:

与其他模式一样,在此模式中,message_buffer将转换为 Unit8Array,并将 Unit8Array 转换为 Int8Array,然后将 Int8Array 与Utilities.computeHmacSignature().

function myFunction() {
  var secret =  'my_secret';
  var message_buffer = ["6d", "79", "5f", "6d", "65", "73", "73", "61", "67", "65"];
  
  // Convert message_buffer (Unsigned hexadecimal array) to Unit8Array.
  var unit8Array = message_buffer.map(e => parseInt(e, 16));
  
  // Convert Unit8Array to Int8Array.
  var int8Array = [...new Int8Array(Uint8Array.from(unit8Array).buffer)];

  var signature_hash = Utilities.computeHmacSignature(Utilities.MacAlgorithm.HMAC_SHA_512, int8Array, Utilities.newBlob(secret).getBytes());
  var signature = Utilities.base64Encode(signature_hash);
  Logger.log(signature);
  // DWpafZMnI4PT5v0jdidFtU5qoh3fsvUKnaOga/Y2Nzy/tvsx1F9p61SjE+hlRQ97y/LMmBkG39IyL5Ja46bJlw==
}

参考:


推荐阅读