22

我可以使用以下方法制作 HMAC:

var encrypt = crypto.createHmac("SHA256", secret).update(string).digest('base64');

我正在尝试使用秘密解密编码的 HMAC:

var decrypt = crypto.createDecipher("SHA256", secret).update(string).final("ascii");

以下不成功。如何使用密钥解密 HMAC?

我收到以下错误:

node-crypto : Unknown cipher SHA256

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

4 回答 4

68

HMAC 是 MAC/keyed hash,而不是密码。它不是为解密而设计的。如果要加密某些内容,请使用 AES 之类的密码,最好使用 AES-GCM 之类的经过身份验证的模式。

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

于 2013-01-08T15:57:37.583 回答
50

再次重申,哈希不是为解密而设计的。但是,一旦您有了哈希,您就可以通过使用相同秘密的相同加密来检查任何字符串是否等于该哈希。

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')
}

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

于 2015-08-25T11:19:46.043 回答
4

正如CodesInChaos所述,带有 SHA256 的 HMAC 只能用于散列值,这只是单向行程。如果您希望能够加密/解密,则必须使用密码,例如aesor des

关于如何加密/解密的示例:

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"));

注意:您必须将密码/解密保存到他们自己的变量中,并确保不要.final.update.

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

openssl list-cipher-algorithm
于 2013-01-08T16:21:13.000 回答
-3

清理极简视图的代码并消除杂乱:注意:IIFE 在节点 repl “As Is”中可运行

!function(){

const crypto = require("crypto");

// key 
var key = crypto.createHash("sha256").digest();


 // 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.createCipher("aes-256-cbc", key);

// update the cipher with our secret string
cipher.update(secret);

// save the encryption 
var encrypted = cipher.final();

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

// create a aes267 decipher based on our password
 var decipher = crypto.createDecipher("aes-256-cbc", key);

// update the decipher with our encrypted string
decipher.update(encrypted);

console.log("Decrypted: %s", decipher.final()); //default is utf8 encoding   final("utf8") not needed for default

}()

/*  REPL Output

            Initial: ermagherd
    Encrypted: T)��l��Ʀ��,�'
    Decrypted: ermagherd
    true
*/
于 2017-10-03T03:57:27.280 回答