Преобразование crypto hmac в строку crypto-js hmac
Я пытаюсь преобразовать секретную строку hmac, чтобы позволить мне проверить мой API в почтальоне. Почтальон поставляется с предустановленным набором cryptojs. Это процесс, который я получил на своем тестовом сервере с использованием crypto:
const crypto = require('crypto');
const generateHmac = (privateKey, ts) => {
const hmac = crypto.createHmac('sha256', privateKey);
hmac.update(ts);
const signature = hmac.digest('hex');
return signature;
}
Это не соответствует строке, созданной с помощью cryptojs в почтальоне:
const createHmacString = (privateKey, ts) => {
const hmac = CryptoJS.HmacSHA256(ts, privateKey).toString(CryptoJS.enc.Hex)
return hmac;
}
Не уверен, что я здесь делаю не так. Заранее спасибо!
2 ответа
Решение
Хорошо, наконец-то это выяснилось - crypto-js не предоставляет настоящие байты, поэтому необходимо все кодировать:
const createHmacString = (privateKey, ts) => {
const key = CryptoJS.enc.Utf8.parse(privateKey)
const timestamp = CryptoJS.enc.Utf8.parse(ts)
const hmac = CryptoJS.enc.Hex.stringify(CryptoJS.HmacSHA256(timestamp, key))
// const hmac = CryptoJS.HmacSHA256(ts, privateKey).toString(CryptoJS.enc.Hex)
return hmac;
}
let ts = new Date().getTime();
const signature = createHmacString("your-private-key", ts);
У меня была аналогичная проблема. Хотя это немного отличается от вопроса, поскольку в моем собственном случае внешнее приложение, которое я создавал, не создавало ту же хэш-подпись, что и бэкэнд-API. Следовательно, мне пришлось использовать следующий метод
function hmacSha256Hex(secret : string, message : any) : string {
let hmac = CryptoJS.algo.HMAC.create(CryptoJS.algo.SHA256, secret);
hmac.update(message);
return CryptoJS.enc.Hex.stringify(hmac.finalize());
}