node.js - 什么是相当于节点缓冲区对象的 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 脚本。
解决方案
我相信你的目标如下。
- 您想使用 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.computeHmacSignature
,secret
也需要转换为字节数组。关于这一点,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==
}
参考:
-
Int8Array 类型数组表示二进制补码 8 位有符号整数数组。
-
Uint8Array 类型数组表示一个 8 位无符号整数数组。
推荐阅读
- ms-access - 如何在不丢失当前视图的情况下刷新快照子表单
- c# - 如何修复验证以更好?
- spring-boot - 通过 RestTemplate 查询 Spring Data Rest
- android - Libgdx 项目生成
- angular - 类型 googlemaps index.d.ts 不是模块错误消息
- pandas - pandas:用一个可以指示它曾经为空的值填充na
- android - 我可以从一个接口端口转发到另一个接口端口吗?
- qt - QT Designer 样式表边框属性
- blockchain - 使用移动应用程序的最终用户使用 HSM 设备进行身份验证有哪些不同的方式?
- java - 我如何正确创建类比率添加(比率 r)?