Я нашел ответ.Прежде всего: 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);
};