正如CodesInChaos所述,帶有SHA256的HMAC只能用於散列一個值,這個值只能是單向的。如果您希望能夠加密/解密,則必須使用密碼,例如aes
或des
。
例如在如何加密/解密:
const crypto = require("crypto");
// key and iv
var key = crypto.createHash("sha256").update("OMGCAT!", "ascii").digest();
var iv = "123456789";
// 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
。
如果你想知道什麼密碼都可以在系統上,使用以下命令:
openssl list-cipher-algorithm
即使是這樣,你不能解密,因爲多個鍵可以散列到相同的價值。哈希是一個單向函數。欲瞭解更多信息:http://en.wikipedia.org/wiki/Hash_function –
@JustinEthier在許多情況下,輸入空間足夠小,猜測工作。在實踐中,你永遠不會用正確的散列猜測錯誤的輸入。您將猜測正確的輸入,或者根本找不到匹配的輸入。 |但是由於HMAC是鍵控的,只有那些知道密鑰的人才能使用這種猜測攻擊,所以這通常不是問題(使用無密鑰的哈希猜測輸入通常是一個問題)。 – CodesInChaos
嗯,真的,自從那條評論以來,我一直向前移動,摧毀它。 –