Crypto-Js 库的 hmac-256 脚本返回函数结构而不是 Google Apps 脚本中的值,在外面工作正常吗?

Crypto-Js library's hmac-256 script returning function structure instead of value within Google Apps Script, working fine outside?

我正在设置一个 google 电子表格项目以连接到我的 CryptoExchange API。 但是当谈到这个简单的 CryptoJs Hmac-sha256 脚本时,它不起作用:它返回函数结构而不是值,而在外部它工作正常 (see my jsfiddle)。

现在,我了解 from this Stack answer Cameron Roberts 所说的 Apps 脚本在某些 POV 下的行为不同,但我无法理解这之间的关系。

此外,如果我只是切换脚本并使用 Stanford Javascript Crypto 库,代码执行完美,完全没有问题,都在 Google Apps Script 以及它之外的当然。

这是我的代码:

eval(UrlFetchApp.fetch('https://cdnjs.cloudflare.com/ajax/libs/crypto-js/3.1.2/rollups/hmac-sha256.js').getContentText());


function write() {
var hash = CryptoJS.HmacSHA256("message", "secret");
return hash;
}
Logger.log(write());

以及来自 Google Apps 脚本的控制台日志

[19-06-07 00:53:32:859 PDT] {mixIn=
function (a) {
    for (var c in a) {
        a.hasOwnProperty(c) && (this[c] = a[c]);
    }
    a.hasOwnProperty("toString") && (this.toString = a.toString);
}
, extend=
function (a) {
    q.prototype = this;
    var c = new q();
    a && c.mixIn(a);
    c.hasOwnProperty("init") || (c.init = function () {
        c.$super.init.apply(this, arguments);
    });
    c.init.prototype = c;
    c.$super = this;
    return c;
}
, init=
function (a, c) {
    a = this.words = a || [];
    this.sigBytes = c != s ? c : 4 * a.length;
}
, random=
function (a) {
    for (var c = [], d = 0; d < a; d += 4) {
        c.push(4294967296 * h.random() | 0);
    }
    return new r.init(c, a);
}
, words=[-1.956689808E9, 6.97680217E8, -1.940439631E9, -5.01717335E8, -

1.205480281E9, -1.798215209E9, 1.0131952E8, 1.469462027E9], clone=
function () {
    var a = m.clone.call(this);
    a.words = this.words.slice(0);
    return a;
}
, sigBytes=32.0, create=
function () {
    var a = this.extend();
    a.init.apply(a, arguments);
    return a;
}
, toString=
function (a) {
    return (a || k).stringify(this);
}
, concat=
function (a) {
    var c = this.words, d = a.words, b = this.sigBytes;
    a = a.sigBytes;
    this.clamp();
    if (b % 4) {
        for (var e = 0; e < a; e++) {
            c[b + e >>> 2] |= (d[e >>> 2] >>> 24 - 8 * (e % 4) & 255) << 24 - 

8 * ((b + e) % 4);
        }
    } else {
        if (65535 < d.length) {
            for (e = 0; e < a; e += 4) {
                c[b + e >>> 2] = d[e >>> 2];
            }
        } else {
            c.push.apply(c, d);
        }
    }
    this.sigBytes += a;
    return this;
}
, clamp=
function () {
    var a = this.words, c = this.sigBytes;
    a[c >>> 2] &= 4294967295 << 32 - 8 * (c % 4);
    a.length = h.ceil(c / 4);
}
, $super={extend=
function (a) {
    q.prototype = this;
    var c = new q();
    a && c.mixIn(a);
    c.hasOwnProperty("init") || (c.init = function () {
        c.$super.init.apply(this, arguments);
    });
    c.init.prototype = c;
    c.$super = this;
    return c;
}
, mixIn=
function (a) {
    for (var c in a) {
        a.hasOwnProperty(c) && (this[c] = a[c]);
    }
    a.hasOwnProperty("toString") && (this.toString = a.toString);
}
, init=
function () {
}
, clone=
function () {
    return this.init.prototype.extend(this);
}
, create=
function () {
    var a = this.extend();
    a.init.apply(a, arguments);
    return a;
}
}}

虽然相同的代码 within jsfiddle 工作正常

编辑: 虽然我的问题仍然是我的好奇心,但我刚刚在堆栈上找到了一个完整的回复分支,其中涉及 Google Apps Script 中的特定方法 我没有不知道:用于创建 HMAC Sha256 签名的内置 Class 实用程序

这可能不是我在理论知识上的问题的答案,但从实践的角度可能会解决我的问题;所以我现在会调查一下。 谢谢

Generate a keyed hash value using the HMAC method with Google Apps Script

get back a string representation from computeDigest(algorithm, value) byte[]

  • 您想使用 Google Apps 脚本从 CryptoJS.HmacSHA256("message", "secret") 中检索 8b5f48702995c1598c573db1e21866a9b825d4a794d169d7060a03605796360b 的值。

如果我的理解是正确的,直接使用Google Apps Script 的方法计算值如何?在这种情况下,不使用 CryptoJS。请将此视为几个答案之一。

示例脚本:

var res = Utilities.computeHmacSha256Signature("message", "secret")
  .map(function(e) {return ("0" + (e < 0 ? e + 256 : e).toString(16)).slice(-2)}).join("");
Logger.log(res)

结果:

8b5f48702995c1598c573db1e21866a9b825d4a794d169d7060a03605796360b

注:

以上脚本的要点如下。

  • 在Google Apps Script中,Utilities.computeHmacSha256Signature()加密的数据是带符号的十六进制字节数组。
  • 在您的例子中,字节数组被转换为无符号十六进制数。

参考文献:

如果我误解了你的问题,这不是你想要的方向,我深表歉意。