我如何解密HMAC?

Tho*_*ggi 12 cryptography sha256 hmac node.js

我可以使用以下内容制作HMAC:

var encrypt = crypto.createHmac("SHA256", secret).update(string).digest('base64');
Run Code Online (Sandbox Code Playgroud)

我试图用秘密解密编码的HMAC:

var decrypt = crypto.createDecipher("SHA256", secret).update(string).final("ascii");
Run Code Online (Sandbox Code Playgroud)

以下是不成功的.如何用密钥解密HMAC?

我收到以下错误:

node-crypto : Unknown cipher SHA256

crypto.js:155
  return (new Decipher).init(cipher, password);
                        ^
Error: DecipherInit error
Run Code Online (Sandbox Code Playgroud)

Cod*_*aos 47

HMAC是MAC /密钥哈希,而不是密码.它不是为解密而设计的.如果要加密某些内容,请使用密码(如AES),最好使用AES-GCM等身份验证模式.

"解密"的唯一方法是猜测整个输入,然后比较输出.

  • 即使这样,你也无法解密它,因为多个键可以散列到相同的值.哈希是一种单向函数.有关更多信息,请访问:http://en.wikipedia.org/wiki/Hash_function (3认同)
  • @JustinEthier在许多情况下,输入空间足够小,猜测起作用.在实践中,你永远不会用正确的哈希猜测错误的输入.您将猜测正确的输入,或者根本找不到匹配的输入.| 但由于HMAC是键控的,只有知道密钥的人才能使用这种猜测攻击,所以这通常不是问题(使用无键的哈希猜测输入通常是个问题). (3认同)

Tho*_*ggi 24

再次重申哈希不是为了解密而设计的.但是,一旦你有了一个哈希,你可以检查任何字符串是否等于该哈希,方法是通过相同的加密使用相同的密码.

var crypto = require('crypto')

var secret = 'alpha'
var string = 'bacon'

var hash = crypto.createHmac('SHA256', secret).update(string).digest('base64');
// => 'IbNSH3Lc5ffMHo/wnQuiOD4C0mx5FqDmVMQaAMKFgaQ='

if (hash === crypto.createHmac('SHA256', secret).update(string).digest('base64')) {
  console.log('match') // logs => 'match'
} else {
  console.log('no match')
}
Run Code Online (Sandbox Code Playgroud)

看似很明显,但非常强大.

  • 这个答案值得更多的爱.其他答案分歧并谈论加密,而这很好地解释了如何使用HMAC本身. (4认同)