如何使用CryptoJS计算256位HMAC_SHA3哈希?

问题描述 投票:0回答:3

最近的 CryptoJS 版本支持 SHA3 哈希。

SHA3 可以输出不同的哈希大小,包括 512 位(默认)和 256 位。这两个工作正常:

var sha3_512_hash = CryptoJS.SHA3( 'test' );
var sha3_256_hash = CryptoJS.SHA3( 'test' , { outputLength:256 } );

同样,CryptoJS也可以计算HMAC值。但是,我不知道如何更改那里的默认输出大小:

var sha3_512_hmac = CryptoJS.HmacSHA3( 'test' , 'key' );
var sha3_256_hmac = CryptoJS.HmacSHA3( 'test' , 'key' , { outputLength:256 } );

第一个工作正常(结果是 512 位 hmac 值),但第二个是相同(即也是 512 位),就好像它忽略了 {outputLength:256} 参数!

这是一个实例:http://jsfiddle.net/M8xf3/(使用 CryptoJS 3.1.2 中的 hmac-sha3.js)

有谁知道如何创建基于 SHA3 的 256 位 HMAC 哈希值?

附注对于 SHA2 函数系列,CryptoJS 对于每个输出大小(即 HmacSHA256 和 HmacSHA512)都有单独的 Hmac 函数。但SHA3似乎不是这样的?

hash sha hmac cryptojs
3个回答
2
投票

这并没有回答实际问题,但请注意,使用 SHA3,您实际上并不需要 HMAC 哈希值。与 SHA1、SHA2 和 MD5 不同,SHA3 不易容易受到长度扩展攻击。

因此,对于 SHA3,只需将密钥添加到您的输入中即可。

或者,如果您偏执于单个哈希步骤受到损害(在可预见的将来不会发生这种情况,尤其是 SHA3,但仍然如此),您可以执行类似 SHA3(key+SHA3(key+data)) 或SHA3(key+SHA3(key+data)+data)(显然“+”表示二进制连接)。


1
投票

您只需编辑 hmac-sha3.js 并将输出长度更改为 256 位而不是 512 位。

  1. 使用文本编辑器打开 hmac-sha3.js 文件。
  2. 找到“{outputLength:512}”并将其替换为“{outputLength:256}”

那么哈希输出的长度将是256位。

为了确保您没有搞砸事情,请使用互联网上提供的一些测试用例仔细检查 256 位 hmac-sha3 输出,例如: http://www.di-mgt.com.au/hmac_sha3_testvectors .html


0
投票

通过阅读https://github.com/brix/crypto-js/blob/ac34a5a584337b33a2e567f50d96819a96ac44bf/src/sha3.js的源代码,您可以使用以下代码:

const HamcWithLen = (len) => {
  const SHA3 = CryptoJS.algo.SHA3.extend({
    cfg: CryptoJS.lib.Hasher.cfg.extend({
      outputLength: len
    })
  });

  return CryptoJS.lib.Hasher._createHmacHelper(SHA3);
}

var secretKey = "My SeCrEt KeY";
console.log('HamcWithLen(256)', HamcWithLen(256)('test', secretKey));
console.log('HamcWithLen(512)', HamcWithLen(512)('test', secretKey));

请检查:https://jsfiddle.net/v4agcpho/

© www.soinside.com 2019 - 2024. All rights reserved.