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/キー付きハッシュであり、暗号ではありません。復号化するようには設計されていません。何かを暗号化する場合は、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は、値をハッシュするためにのみ使用できます。これは、片道のみです。暗号化/復号化できるようにする場合は、aesまたはなどの暗号を使用する必要があります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

ミニマリストビューのコードのクリーンアップとクラッターの除去:注:ノードreplで実行可能なIIFE「現状のまま」

!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 に答える