首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何解密HMAC?

如何解密HMAC?
EN

Stack Overflow用户
提问于 2013-01-08 23:54:40
回答 4查看 93.5K关注 0票数 17

我可以使用以下内容创建HMAC:

代码语言:javascript
复制
var encrypt = crypto.createHmac("SHA256", secret).update(string).digest('base64');

我正在尝试使用以下密钥解密已编码的HMAC:

代码语言:javascript
复制
var decrypt = crypto.createDecipher("SHA256", secret).update(string).final("ascii");

以下操作未成功。如何使用密钥解密HMAC?

我得到以下错误:

代码语言:javascript
复制
node-crypto : Unknown cipher SHA256

crypto.js:155
  return (new Decipher).init(cipher, password);
                        ^
Error: DecipherInit error
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2013-01-08 23:57:38

HMAC是MAC/密钥哈希,而不是密码。它不是用来解密的。如果您想要加密某些内容,请使用密码,如AES,最好是在验证模式下,如AES-GCM。

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

票数 64
EN

Stack Overflow用户

发布于 2015-08-25 19:19:46

再次重申,哈希不是用来解密的。然而,一旦你有了一个散列,你就可以通过用相同的秘密对它进行相同的加密,来检查任何字符串是否等于那个散列。

代码语言:javascript
复制
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')
}

看起来很明显,但却非常强大。

票数 46
EN

Stack Overflow用户

发布于 2013-01-09 00:21:13

正如CodesInChaos已经指出的,带有SHA256的HMAC只能用于散列值,这只能是单向的。如果您希望能够加密/解密,则必须使用密码,例如aesdes

加密/解密示例:

代码语言:javascript
复制
const crypto = require("crypto");

// key and iv   
var key = crypto.createHash("sha256").update("OMGCAT!", "ascii").digest();
var iv = "1234567890123456";

// this is the string we want to encrypt/decrypt
var secret = "ermagherd";

console.log("Initial: %s", secret);

// create a aes256 cipher based on our password
var cipher = crypto.createCipheriv("aes-256-cbc", key, iv);
// update the cipher with our secret string
cipher.update(secret, "ascii");
// save the encryption as base64-encoded
var encrypted = cipher.final("base64");

console.log("Encrypted: %s", encrypted);

// create a aes267 decipher based on our password
var decipher = crypto.createDecipheriv("aes-256-cbc", key, iv);
// update the decipher with our encrypted string
decipher.update(encrypted, "base64");

console.log("Decrypted: %s", decipher.final("ascii"));

注意:你必须将加密/解密保存到自己的变量中,并且还要确保在.update__之后不要链接.final

如果您想知道您的系统上有哪些密码,请使用以下命令:

代码语言:javascript
复制
openssl list-cipher-algorithm
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14218925

复制
相关文章

相似问题

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