我们可以用CryptoJS.HmacSHA256(message, key)
计算hmac
但是我想用公式Sha256( concat ( key xor opad, Sha256( concat( key xor ipad, message ) )
实现它
我做了以下工作
const key = "e9058ab198f6908f702111b0c0fb5b36f99d00554521886c40e2891b349dc7a1";
const ipad = "3636363636363636363636363636363636363636363636363636363636363636";
const opad = "5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c";
const mess = "2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824";
const alpha = "b559d6edc4aaccd32c7d4dec9ca7076aa5c15c09197dd4301cbed54768c19bfd"; // key xor opad
const beta = "df33bc87aec0a6b946172786f6cd6d00cfab36637317be5a76d4bf2d02abf197"; // key xor ipad
const hmac = CryptoJS.SHA256( alpha + String ( CryptoJS.SHA256( ( beta + mess ) ) ) ) ;
但是它不起作用,有帮助吗?
例如,下面的代码是我找到的
hmac = "594b7b8b1dea8dd016c1702c5b2d8b75ba20d744423b08e8897f02454000abad"
但真正的一个是:"fc7e0b4417a84790035480f97f9a792d8328a497039ae483b4b85197c008669e"
,它是用CryptoJS.HmacSHA256(CryptoJS.enc.Hex.parse(mess), key))
计算的
发布于 2022-04-05 11:40:44
引用实现CryptoJS.HmacSHA256(CryptoJS.enc.Hex.parse(mess), key))
使用HMAC摘要生成SHA256。因此,对消息进行十六进制解码,并对密钥UTF8进行编码。UTF8编码的结果是64个字节的键,这正好是SHA256的块大小。因此,不需要将0x00值填充到64个字节,也不需要使用SHA256进行散列。
在您的代码中,我的意思是看到以下问题:在任何地方都没有考虑到不同的编码,这些编码对结果至关重要。而且,在我看来,SHA256的块大小似乎没有得到适当的考虑或根本没有考虑。至于XOR操作,可以很容易地用CryptoJS完成,不需要其他工具。
对HMAC的计算可以分三个步骤进行:
所有的步骤都可以用CryptoJS完成。因此,crypto-js/src/hmac.js是一个有用的蓝图。注意,CryptoJS在内部与WordArray
的操作一起工作。对于XOR操作,这意味着处理单词,即迭代超过64/4 = 16字。
一项可能的执行是:
// Key is UTF8 encoded 64 bytes -> no padding / no hashing required
const key = "e9058ab198f6908f702111b0c0fb5b36f99d00554521886c40e2891b349dc7a1"
const mess = "2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824";
// Step 1: determine K xor opad (oKeyWA), K xor ipad (iKeyWA)
//
var hasherBlockSizeBytes = 64; // in bytes
var hasherBlockSize = hasherBlockSizeBytes/4; // in words
var keyWA = CryptoJS.enc.Utf8.parse(key);
var oKeyWA = keyWA.clone();
var iKeyWA = keyWA.clone();
var oKeyWords = oKeyWA.words;
var iKeyWords = iKeyWA.words;
for (var i = 0; i < hasherBlockSize; i++) {
oKeyWords[i] ^= 0x5c5c5c5c;
iKeyWords[i] ^= 0x36363636;
}
// Step 2: determine P = H( (K xor ipad) || M )
//
var messWA = CryptoJS.enc.Hex.parse(mess);
var iKeyMessWA = iKeyWA.concat(messWA);
var iKeyMessHashWA = CryptoJS.SHA256(iKeyMessWA);
// Step 3: determine HMAC = H ( (K xor opad) || P)
//
var oKeyiKeyMessHashWA = oKeyWA.concat(iKeyMessHashWA);
var hmacWA = CryptoJS.SHA256(oKeyiKeyMessHashWA);
document.getElementById("hmac").innerHTML = hmacWA.toString(CryptoJS.enc.Hex);
// Comparison with built-in function
var hmacDirectWA = CryptoJS.HmacSHA256(messWA, keyWA);
document.getElementById("hmacDir").innerHTML = hmacDirectWA.toString(CryptoJS.enc.Hex);
<script src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/4.1.1/crypto-js.min.js">
</script>
<p style="font-family:'Courier New', monospace;" id="hmac"></p>
<p style="font-family:'Courier New', monospace;" id="hmacDir"></p>
https://stackoverflow.com/questions/71746859
复制相似问题