如何將以下 Node 的內置加密模塊加密轉換為CryptoJS?
const crypto = require('crypto');
const pass = 'some,password:)with>spec(chars*'
const cipher1 = crypto.createCipher('aes-256-cbc', pass)
const c1 = cipher1.update(input, 'utf8', 'hex') cipher1.final('hex')
我嘗試過這樣的事情,但結果不一樣:
const CryptoJS = require('crypto-js');
const pass = 'some,password:)with>spec(chars*'
const cipher2 = CryptoJS.AES.encrypt(input, pass, {
mode: CryptoJS.mode.CBC,
});
const c2 = cipher2.ciphertext.toString(CryptoJS.enc.Hex);
我需要將其用作 Postman 預請求腳本,因為它不支持 Node 的crypto,但是crypto-js.
uj5u.com熱心網友回復:
兩種代碼都使用 OpenSSL 專有密鑰派生函式EVP_BytesToKey(),迭代計數為 1,MD5 作為摘要。
NodeJS 不使用鹽,而 CryptoJS 使用隨機鹽。出于這個原因,每次加密的 NodeJS 結果都不會改變,而 CryptoJS 結果總是會發生變化(假設明文和密碼相同)。
因此,要使用 CryptoJS 代碼獲得 NodeJS 代碼的結果,您不能使用鹽。但是,默認情況下,始終應用鹽。這只能通過使用密鑰派生函式顯式確定密鑰和 IV,EvpKDF然后在加密中使用兩者來規避:
var input = "The quick brown fox jumps over the lazy dog";
var pass = 'some,password:)with>spec(chars*'
var keySize = 32/4;
var ivSize = 16/4;
var kdf = CryptoJS.algo.EvpKDF.create({ keySize: keySize ivSize, hasher: CryptoJS.algo.MD5 }).compute(pass, ''); // no salt!
var key = CryptoJS.lib.WordArray.create(kdf.words.slice(0, keySize), keySize * 4);
var iv = CryptoJS.lib.WordArray.create(kdf.words.slice(keySize), ivSize * 4);
var ciphertextCP = CryptoJS.AES.encrypt(input, key, {iv: iv}); // default: CBC, PKCS#7 padding
var ciphertext = ciphertextCP.ciphertext.toString(CryptoJS.enc.Hex);
document.getElementById("ct").innerHTML = ciphertext; // d98cf2d285bf0c1d796226190bf54d9c5540300ee1c6f35618f8bb3564b5053920ec958d31b41bbe4e4880e23543d709
<script src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/4.0.0/crypto-js.min.js"></script>
<p style="font-family:'Courier New', monospace;" id="ct"></p>
此 CryptoJS 代碼為與 NodeJS 代碼相同的明文和密碼生成相同的密文。
請注意,密鑰派生EVP_BytesToKey()和所選引數已被棄用并被認為是不安全的。由于缺少鹽,NodeJS 比 CryptoJS 更是如此。
避免內置密鑰派生功能,直接指定密鑰更安全。
為此,請在 NodeJS 中使用createCipheriv()并像WordArray在 CryptoJS 代碼中一樣傳遞密鑰。這樣,必須為每次加密顯式生成隨機 IV。
可選地,可以使用像 PBKDF2 這樣的可靠密鑰派生函式,這兩個庫都支持。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/408222.html
標籤:
