Скрипт hmac-256 библиотеки Crypto-Js, возвращающий функциональную структуру вместо значения в Google Apps Script, работает нормально снаружи? - PullRequest
2 голосов
/ 07 июня 2019

Я настраиваю проект электронной таблицы Google для подключения к моему CryptoExchange API. Но когда дело доходит до этого простого скрипта CryptoJs Hmac-sha256, он не работает: он возвращает структуру функции вместо значения, а за ее пределами работает нормально ( см. Мой jsfiddle ).

Теперь я понимаю из этого ответа стека Кэмерона Робертса о том, что Apps Script ведет себя по-разному при определенных POV, но я не могу понять, как это связано.

Кроме того, если я просто переключу скрипт и использую Stanford Javascript Crypto Библиотека, код выполняется отлично без проблем, как в Google Сценарий приложений и, конечно, вне его.

Вот мой код:

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 Script

[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;
}
}}

Хотя тот же код в jsfiddle отлично работает

EDIT: Хотя мой вопрос по-прежнему является источником любопытства для меня, я только что нашел здесь целую ветку ответов в стеке, которые включают определенный метод в скрипте Google Apps , о котором я не знал: a встроенная в Class Utility для создания подписи HMAC Sha256.

Возможно, это не самый ответ на мой вопрос с точки зрения теоретических знаний, но, вероятно, решит мою проблему с практической точки зрения; так что я сейчас посмотрю на это. Спасибо

Создание ключевого хеш-значения с использованием метода HMAC с помощью Google Apps Script

Как получить значение Hex из метода computeHmacSha256Signature скрипта Google Apps?

возвращает строковое представление из байта computeDigest (алгоритм, значение) []

1 Ответ

1 голос
/ 07 июня 2019
  • Вы хотите получить значение 8b5f48702995c1598c573db1e21866a9b825d4a794d169d7060a03605796360b из CryptoJS.HmacSHA256("message", "secret") с помощью Google Apps Script.

Если мое понимание верно, как насчет прямого вычисления значения с использованием методов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 данные, зашифрованные с помощью Utilities.computeHmacSha256Signature(), представляют собой массив байтов шестнадцатеричного числа со знаком.
  • В вашем случаемассив байтов преобразуется в шестнадцатеричное без знака.

Ссылки:

Если я неправильно понял ваш вопрос, и это не то направление, которое вы хотите, я прошу прощения.

...