如何获取 Google Apps 脚本来进行 SHA-256 加密?
How do I get Google Apps Script to do SHA-256 encryption?
我需要使用 TEXT 输入、1 轮、HEX 输出、SHA-256 加密来加密字符串。这应该是一串长度为64的字符。
我在 Google Apps 脚本文档 returns 中尝试过的每个 SHA-256 加密模块都是一组数字。例如。
function SHA256() {
var signature = Utilities.computeHmacSha256Signature("this is my input",
"my key - use a stronger one",
Utilities.Charset.US_ASCII);
Logger.log(signature);
}
输出
[53, -75, -52, -25, -47, 86, -21, 14, -2, -57, 5, -13, 24, 105, -2, -84, 127, 115, -40, -75, -93, -27, -21, 34, -55, -117, -36, -103, -47, 116, -55, -61]
我没有在文档或其他地方看到任何指定我要在上面概述的 GAS 参数的内容。如果需要的话,我不介意从头开始对它进行更深入的解释。我正在加密信息以发送到 Facebook 以实现广告的离线转化。 Facebook 如何解密加密的字符串?
Google Apps 脚本文档
https://developers.google.com/apps-script/reference/utilities/utilities#computeHmacSha256Signature(String,String,Charset)
̶U̶t̶i̶l̶i̶t̶i̶e̶s̶.̶c̶o̶m̶p̶u̶t̶e̶H̶m̶a̶c̶S̶h̶a̶2̶5̶6̶S̶i̶g̶n̶a̶t̶u̶r̶e̶
Utilities.computeDigest()
returns 字节数组(8 位整数)。如果你想将该数组转换为由十六进制字符组成的字符串,你必须手动完成,如下所示:
/** @type Byte[] */
var signature = Utilities.computeDigest(Utilities.DigestAlgorithm.SHA_256, value);
/** @type String */
var hexString = signature
.map(function(byte) {
// Convert from 2's compliment
var v = (byte < 0) ? 256 + byte : byte;
// Convert byte to hexadecimal
return ("0" + v.toString(16)).slice(-2);
})
.join("");
这里有一对将 SHA-256 散列生成为十六进制字符串的函数:
function Sha256Hash(value) {
return BytesToHex(
Utilities.computeDigest(
Utilities.DigestAlgorithm.SHA_256, value));
}
function BytesToHex(bytes) {
let hex = [];
for (let i = 0; i < bytes.length; i++) {
let b = parseInt(bytes[i]);
if (b < 0) {
c = (256+b).toString(16);
} else {
c = b.toString(16);
}
if (c.length == 1) {
hex.push("0" + c);
} else {
hex.push(c);
}
}
return hex.join("");
}
事实证明,bytes[]
类型可以用作普通 Array
,所以我在编写 BytesToHex()
.
时利用了这一点
必须有更优雅的方法,但我更进一步并设法派生出正确的签名来调用 AWS API:
// Google Apps Script version of https://docs.aws.amazon.com/general/latest/gr/signature-v4-examples.html#signature-v4-examples-javascript
function getSignatureKey(key, dateStamp, regionName, serviceName) {
const kDate = Utilities.computeHmacSha256Signature(dateStamp, "AWS4" + key);
Logger.log("kDate = '" + BytesToHex(kDate) + "'");
const kRegion = Utilities.computeHmacSha256Signature(Utilities.newBlob(regionName).getBytes(), kDate);
Logger.log("kRegion = '" + BytesToHex(kRegion) + "'");
const kService = Utilities.computeHmacSha256Signature(Utilities.newBlob(serviceName).getBytes(), kRegion);
Logger.log("kService = '" + BytesToHex(kService) + "'");
const kSigning = Utilities.computeHmacSha256Signature(Utilities.newBlob("aws4_request").getBytes(), kService);
Logger.log("kSigning = '" + BytesToHex(kSigning) + "'");
return kSigning;
}
function Sha256Hmac(value, key) {
return BytesToHex(Utilities.computeHmacSha256Signature(Utilities.newBlob(value).getBytes(), key));
}
我需要使用 TEXT 输入、1 轮、HEX 输出、SHA-256 加密来加密字符串。这应该是一串长度为64的字符。
我在 Google Apps 脚本文档 returns 中尝试过的每个 SHA-256 加密模块都是一组数字。例如。
function SHA256() {
var signature = Utilities.computeHmacSha256Signature("this is my input",
"my key - use a stronger one",
Utilities.Charset.US_ASCII);
Logger.log(signature);
}
输出
[53, -75, -52, -25, -47, 86, -21, 14, -2, -57, 5, -13, 24, 105, -2, -84, 127, 115, -40, -75, -93, -27, -21, 34, -55, -117, -36, -103, -47, 116, -55, -61]
我没有在文档或其他地方看到任何指定我要在上面概述的 GAS 参数的内容。如果需要的话,我不介意从头开始对它进行更深入的解释。我正在加密信息以发送到 Facebook 以实现广告的离线转化。 Facebook 如何解密加密的字符串?
Google Apps 脚本文档
https://developers.google.com/apps-script/reference/utilities/utilities#computeHmacSha256Signature(String,String,Charset)
̶U̶t̶i̶l̶i̶t̶i̶e̶s̶.̶c̶o̶m̶p̶u̶t̶e̶H̶m̶a̶c̶S̶h̶a̶2̶5̶6̶S̶i̶g̶n̶a̶t̶u̶r̶e̶
Utilities.computeDigest()
returns 字节数组(8 位整数)。如果你想将该数组转换为由十六进制字符组成的字符串,你必须手动完成,如下所示:
/** @type Byte[] */
var signature = Utilities.computeDigest(Utilities.DigestAlgorithm.SHA_256, value);
/** @type String */
var hexString = signature
.map(function(byte) {
// Convert from 2's compliment
var v = (byte < 0) ? 256 + byte : byte;
// Convert byte to hexadecimal
return ("0" + v.toString(16)).slice(-2);
})
.join("");
这里有一对将 SHA-256 散列生成为十六进制字符串的函数:
function Sha256Hash(value) {
return BytesToHex(
Utilities.computeDigest(
Utilities.DigestAlgorithm.SHA_256, value));
}
function BytesToHex(bytes) {
let hex = [];
for (let i = 0; i < bytes.length; i++) {
let b = parseInt(bytes[i]);
if (b < 0) {
c = (256+b).toString(16);
} else {
c = b.toString(16);
}
if (c.length == 1) {
hex.push("0" + c);
} else {
hex.push(c);
}
}
return hex.join("");
}
事实证明,bytes[]
类型可以用作普通 Array
,所以我在编写 BytesToHex()
.
必须有更优雅的方法,但我更进一步并设法派生出正确的签名来调用 AWS API:
// Google Apps Script version of https://docs.aws.amazon.com/general/latest/gr/signature-v4-examples.html#signature-v4-examples-javascript
function getSignatureKey(key, dateStamp, regionName, serviceName) {
const kDate = Utilities.computeHmacSha256Signature(dateStamp, "AWS4" + key);
Logger.log("kDate = '" + BytesToHex(kDate) + "'");
const kRegion = Utilities.computeHmacSha256Signature(Utilities.newBlob(regionName).getBytes(), kDate);
Logger.log("kRegion = '" + BytesToHex(kRegion) + "'");
const kService = Utilities.computeHmacSha256Signature(Utilities.newBlob(serviceName).getBytes(), kRegion);
Logger.log("kService = '" + BytesToHex(kService) + "'");
const kSigning = Utilities.computeHmacSha256Signature(Utilities.newBlob("aws4_request").getBytes(), kService);
Logger.log("kSigning = '" + BytesToHex(kSigning) + "'");
return kSigning;
}
function Sha256Hmac(value, key) {
return BytesToHex(Utilities.computeHmacSha256Signature(Utilities.newBlob(value).getBytes(), key));
}