NodeJS:createCipheriv 应该提供与之前的 createCipher 相同的输出
NodeJS: createCipheriv should give same output like earlier createCipher
目前,我正在使用旧版本的crypto.js来加密和解密字符串。
下面是我的加密代码 -
const encrypt = (password, algorithm, encMethod) => (value) => {
const cipher = crypto.createCipher(algorithm, password);
return cipher.update(JSON.stringify(value), 'utf8', encMethod)
+ cipher.final(encMethod);
};
使用上面的代码我的字符串 (E-mailID)
p1@yopmail.com
被转换为
29c68f3bad0068c44122e734367f64557112e058c8222e3fd3908e68402ce6d5
现在 createCipher
已弃用,我应该如何处理 createCipheriv
以提供与上面相同的输出。
我试图将 null
作为 IV
传递给函数 createCipheriv
,但我得到了错误 Missing IV for cipher aes-256-cbc-hmac-sha1
是的,最后我使用下面的一些技巧解决了同样的问题 -
const bytesToKey = require('evp_bytestokey');
const encryptionToken = bytesToKey(SomePasswordString, null, 256, 16);
//Ciphering
const cipher = crypto.createCipheriv('aes-256-cbc-hmac-sha1', encryptionToken.key, encryptionToken.iv);
return cipher.update(JSON.stringify(##VALUEtoENCRYPT##), 'utf8', 'hex') + cipher.final('hex');
//De-Ciphering
const decipher = crypto.createDecipheriv('aes-256-cbc-hmac-sha1', encryptionToken.key, encryptionToken.iv);
return JSON.parse(decipher.update(##VALUEtoDECRYPT##, 'hex', 'utf8') + decipher.final('utf8'));
感谢 @topaco
建议我使用 NPM 包 evp_bytestokey
不确定这是否是正确/好的方法,我们可以每次使用相同的 key
和 iv
到 return 相同的加密和解密值。如果您没有考虑 key
和 iv
,您可以尝试使用 0 填充缓冲区作为 key
和 iv
.
var crypto = require('crypto');
var algo = 'aes-256-ctr';
var key = Buffer.alloc(32);
key.fill(0);
var iv = Buffer.alloc(16);
iv.fill(0);
const encrypt = (text) => {
var cipher = crypto.createCipheriv(algo, key, iv);
var crypted = cipher.update(text, 'utf8', 'base64');
crypted += cipher.final('base64');
return crypted
};
const decrypt = (text) => {
var decipher = crypto.createDecipheriv(algo, key, iv);
var crypted = decipher.update(text, 'base64', 'utf8');
crypted += decipher.final('utf8');
return crypted;
};
var encrypted = encrypt('yourpassword');
console.log(encrypted); //pfq1CtIh+vraJ9Bw
var decrypted = decrypt('pfq1CtIh+vraJ9Bw');
console.log(decrypted); //yourpassword
目前,我正在使用旧版本的crypto.js来加密和解密字符串。
下面是我的加密代码 -
const encrypt = (password, algorithm, encMethod) => (value) => {
const cipher = crypto.createCipher(algorithm, password);
return cipher.update(JSON.stringify(value), 'utf8', encMethod)
+ cipher.final(encMethod);
};
使用上面的代码我的字符串 (E-mailID)
p1@yopmail.com
被转换为
29c68f3bad0068c44122e734367f64557112e058c8222e3fd3908e68402ce6d5
现在 createCipher
已弃用,我应该如何处理 createCipheriv
以提供与上面相同的输出。
我试图将 null
作为 IV
传递给函数 createCipheriv
,但我得到了错误 Missing IV for cipher aes-256-cbc-hmac-sha1
是的,最后我使用下面的一些技巧解决了同样的问题 -
const bytesToKey = require('evp_bytestokey');
const encryptionToken = bytesToKey(SomePasswordString, null, 256, 16);
//Ciphering
const cipher = crypto.createCipheriv('aes-256-cbc-hmac-sha1', encryptionToken.key, encryptionToken.iv);
return cipher.update(JSON.stringify(##VALUEtoENCRYPT##), 'utf8', 'hex') + cipher.final('hex');
//De-Ciphering
const decipher = crypto.createDecipheriv('aes-256-cbc-hmac-sha1', encryptionToken.key, encryptionToken.iv);
return JSON.parse(decipher.update(##VALUEtoDECRYPT##, 'hex', 'utf8') + decipher.final('utf8'));
感谢 @topaco
建议我使用 NPM 包 evp_bytestokey
不确定这是否是正确/好的方法,我们可以每次使用相同的 key
和 iv
到 return 相同的加密和解密值。如果您没有考虑 key
和 iv
,您可以尝试使用 0 填充缓冲区作为 key
和 iv
.
var crypto = require('crypto');
var algo = 'aes-256-ctr';
var key = Buffer.alloc(32);
key.fill(0);
var iv = Buffer.alloc(16);
iv.fill(0);
const encrypt = (text) => {
var cipher = crypto.createCipheriv(algo, key, iv);
var crypted = cipher.update(text, 'utf8', 'base64');
crypted += cipher.final('base64');
return crypted
};
const decrypt = (text) => {
var decipher = crypto.createDecipheriv(algo, key, iv);
var crypted = decipher.update(text, 'base64', 'utf8');
crypted += decipher.final('utf8');
return crypted;
};
var encrypted = encrypt('yourpassword');
console.log(encrypted); //pfq1CtIh+vraJ9Bw
var decrypted = decrypt('pfq1CtIh+vraJ9Bw');
console.log(decrypted); //yourpassword