Миграция из библиотеки «crypto» в библиотеку crypto-js: двоичное кодирование - PullRequest
0 голосов
/ 26 сентября 2018

Я пытаюсь сгенерировать хэши SHA256 и HmacSHA512 на устройстве, которое, к сожалению, не поддерживает стандартную библиотеку Node crypto.Поэтому я настраиваю код для использования CryptoJS.Однако CryptoJS не может кодировать хэш как в двоичном формате (только Hex, Base64 и Latin1 являются доступными кодировщиками).

Ниже приведена функция, которую я пытаюсь перенести.Предыдущий (неиспользуемый) код закомментирован.

const getMessageSignature = (path, request, secret, nonce) => {
    // Expected outcome:
    // API-Sign = Message signature using HMAC-SHA512 of (URI path + SHA256(nonce + POST data)) and base64 decoded secret API key
    const message = JSON.stringify(request);

    const secret_buffer = btoa(secret);
    const hash = CryptoJS.algo.SHA256.create();
    const hmac = CryptoJS.algo.HMAC.create(CryptoJS.algo.SHA256, secret_buffer);
    const hash_digest = hash.update(nonce + message).finalize().toString(CryptoJS.enc.Base64);
    const hmac_digest = hmac.update(path + hash_digest).finalize().toString(CryptoJS.enc.Base64);

    // CANNOT USE BELOW (Buffer and crypto not supported)
    // const secret_buffer = new Buffer(secret, 'base64');
    // const hash = new crypto.createHash('sha256');
    // const hmac = new crypto.createHmac('sha512', secret_buffer);
    // const hash_digest = hash.update(nonce + message).digest('binary');
    // const hmac_digest = hmac.update(path + hash_digest, 'binary').digest('base64');

    return hmac_digest;
};

1 Ответ

0 голосов
/ 27 сентября 2018

Я нашел ответ.Прежде всего: btoa() не является необходимым, поскольку CryptoJS имеет собственную функциональность для преобразования Base64 в свой собственный формат (WordLists): CryptoJS.enc.Base64.parse.Далее следует, что path и hash_digest не могут быть объединены должным образом, так как существует несоответствие типов (строковое и двоичное), поэтому JS использует строковое представление.Решение состоит в том, чтобы сначала создать HAAC SHA512 с использованием CryptoJS.algo.HMAC.create(CryptoJS.algo.SHA512, secret), а затем постепенно обновлять его для каждого значения с помощью hmac.update(value, secret).Наконец, вам также придется использовать встроенный декодер CryptoJS Base64, чтобы, наконец, создать строку подписи.

const getMessageSignature = (path, request, secret, nonce) => {
    // API-Sign = Message signature using HMAC-SHA512 of (URI path + SHA256(nonce + POST data)) and base64 decoded secret API key
    const message = JSON.stringify(request);
    const hash = CryptoJS.SHA256(nonce + message);
    const secret_buffer = CryptoJS.enc.Base64.parse(secret);
    const hmac = CryptoJS.algo.HMAC.create(CryptoJS.algo.SHA512, secret_buffer);
    hmac.update(path, secret_buffer);
    hmac.update(hash, secret_buffer);
    return hmac.finalize().toString(CryptoJS.enc.Base64);
};
...