问题描述
我想在Google应用脚本中运行以下NodeJS代码
const CryptoJS = require("crypto-js");
let timeStamp_nonce = Date.Now().toString();
let bodystring = `{"ID":"001"}`
const body = JSON.parse(bodystring)
const secret = "secret"
const msg= {
timeStamp_nonce: timeStamp_nonce,body: JSON.stringify(body)
};
const payload = new Buffer(JSON.stringify(msg)).toString('base64');
const signature = CryptoJS.enc.Hex.stringify(CryptoJS.HmacSHA512(payload,secret));
console.log("Payload:",payload)
console.log("\nSignature:",signature)
我尝试转换:
let timeStamp_nonce = Date.Now().toString();
let bodystring = `{"ID":"001"}`
const body = JSON.parse(bodystring)
const secret = "secret"
const msg = {
timeStamp_nonce: timeStamp_nonce,body: JSON.stringify(body)
};
const payload = Utilities.base64Encode(JSON.stringify(msg));
//
// confused on this part...
//
//const signature = CryptoJS.enc.Hex.stringify(CryptoJS.HmacSHA512(payload,secret));
//
//
Logger.log("Payload:",i)
Logger.log("\nSignature:",signature)
任何人都可以帮忙在Google Apps脚本中运行
解决方法
我相信您的目标如下。
- 您要将问题中的Node.js脚本转换为Google Apps脚本。
我认为可以使用Google Apps脚本的内置功能来实现此转换。请检查以下示例脚本。
示例脚本:
let timeStamp_nonce = Date.now().toString();
let bodystring = `{"ID":"001"}`
const body = JSON.parse(bodystring)
const secret = "secret"
const msg= {
timeStamp_nonce: timeStamp_nonce,body: JSON.stringify(body)
};
const payload = Utilities.base64Encode(JSON.stringify(msg));
const bytes = Utilities.computeHmacSignature(Utilities.MacAlgorithm.HMAC_SHA_512,payload,secret);
const signature = bytes.map(b => ('0' + (b & 0xFF).toString(16)).slice(-2)).join('');
console.log("Payload:",payload)
console.log("\nSignature:",signature)
结果:
当timeStamp_nonce
为"1234567890123"
时,您的Node.js脚本返回以下值。
Payload: eyJ0aW1lU3RhbXBfbm9uY2UiOiIxMjM0NTY3ODkwMTIzIiwiYm9keSI6IntcIklEXCI6XCIwMDFcIn0ifQ==
Signature: bd291d4c05e1a217afd90e2036fad2f3273ed4e4eada909fe5878cf2e902849ec5b01b160e20d8f43b0564be83e4a74391ccd280d43771a12a1363e5458ad61d
我可以确认有关此结果的信息,当将timeStamp_nonce = "1234567890123"
用于上述Google Apps脚本时,可以获得相同的结果。
注意:
- 在Google Apps脚本中,由
Utilities.computeHmacSignature
加密的值是带符号的十六进制的字节数组。在这种情况下,为了实现转换,需要将bytes数组转换为无符号十六进制。 - 请在启用V8的情况下使用上述Google Apps脚本。