Помните, что дайджест sha256 - это последовательность байтов: это не "нормальная строка".Похоже, что CryptoJS преобразует настоящий дайджест sha256 во что-то другое для удобства, поэтому не делайте этого, и все готово.
Использование библиотеки Node's crypto
(которая является встроенным API) а не CryptoJS (который имеет абсолютно ужасную документацию, поэтому его использование довольно сомнительно):
const crypto = require("crypto");
function HMAC(key, text) {
return crypto.createHmac("sha256", key).update(text).digest();
}
А затем мы формируем канонический хеш:
const canonString = [
'GET',
'/',
'Action=ListUsers&Version=2010-05-08',
'content-type:application/x-www-form-urlencoded; charset=utf-8',
'host:iam.amazonaws.com',
'x-amz-date:20150830T123600Z',
'',
'content-type;host;x-amz-date',
'e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855'
].join('\n');
// note: plain hash, not a secret-key-seeded hash
const canonHash = crypto.createHash("sha256").update(canonString).digest();
console.log("Canonical hash is :", canonHash.toString('hex'));
Это дает f536975d06c0309214f805bb90ccff089219ecd68b2577efef23edd43b7e1a59
.Затем мы продолжаем:
const kSecret = "wJalrXUtnFEMI/K7MDENG+bPxRfiCYEXAMPLEKEY";
const kDate = HMAC("AWS4" + kSecret,"20150830");
const kRegion = HMAC(kDate,"us-east-1");
const kService = HMAC(kRegion,"iam");
const kSigning = HMAC(kService,"aws4_request");
console.log("kSigning hash is :", kSigning.toString('hex'));
Что дает c4afb1cc5771d871763a393e44b703571b55cc28424d1a5e86da6ed3c154a4b9
: обратите внимание, что мы не делаем какое-либо преобразование в шестнадцатеричное, потому что это шестнадцатеричное дайджест , а не дайджест sha256Это совершенно другая строка.Мы преобразуем только в шестнадцатеричную строку, чтобы сделать дайджест разборчивым в журнале консоли.
Затем, наконец:
const stringToSign = [
'AWS4-HMAC-SHA256',
'20150830T123600Z',
'20150830/us-east-1/iam/aws4_request',
canonHash.toString('hex')
].join('\n');
const signed = HMAC(kSigning, stringToSign);
console.log("Final signed hash is:", signed.toString('hex'));
Что дает 5d672d79c15b13162d9279b0855cfba6789a8edb4c82c400e06b5924a6f2b5d7
.Обратите внимание, что здесь у нас было , чтобы превратить канонический хеш в шестнадцатеричную строку, согласно инструкциям на страницах, на которые вы ссылаетесь, но мы не касаемся дайджеста kSigning
,это должно оставаться настоящей строкой байта sha256.