首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何用hmacSHA256实现CryptoJS

如何用hmacSHA256实现CryptoJS
EN

Stack Overflow用户
提问于 2022-04-05 05:51:46
回答 1查看 2.7K关注 0票数 0

我们可以用CryptoJS.HmacSHA256(message, key)计算hmac

但是我想用公式Sha256( concat ( key xor opad, Sha256( concat( key xor ipad, message ) )实现它

我做了以下工作

代码语言:javascript
运行
复制
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))计算的

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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的计算可以分三个步骤进行:

  1. (K )和(K )的测定。
  2. P= H( (K )x~(M))的测定
  3. 测定HMAC = H( (K )x\p ),与最终结果相对应。

所有的步骤都可以用CryptoJS完成。因此,crypto-js/src/hmac.js是一个有用的蓝图。注意,CryptoJS在内部与WordArray的操作一起工作。对于XOR操作,这意味着处理单词,即迭代超过64/4 = 16字。

一项可能的执行是:

代码语言:javascript
运行
复制
// 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);
代码语言:javascript
运行
复制
<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>

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71746859

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档