我使用此代码来加密/解密字符串值
var crypto = require('crypto');
function encrypt(text){
var cipher = crypto.createCipher('aes-256-cbc','secret key');
var encrypted = cipher.update(text.toString(),'utf8','hex') + cipher.final('hex');
return encrypted;
}
function decrypt(text){
var decipher = crypto.createDecipher('aes-256-cbc','secret key');
var decrypted = decipher.update(text.toString(),'hex','utf8') + decipher.final('utf8');
return decrypted ;
}
module.exports.encrypt = encrypt;
module.exports.decrypt = decrypt;
当我尝试解密未加密的内容时,例如decrypt('test'),它会引发以下错误:
crypto.js:292
var ret = this._binding.final();
^
TypeError: error:0606506D:digital envelope routines:EVP_DecryptFinal_ex:wrong final block length
at Decipher.Cipher.final (crypto.js:292:27)
我还尝试使用没有成功的缓冲区,无法在Internet上找到任何解决方案。
真正的问题是我用它来解密cookie值。如果黑客创建一个值为“test”的假cookie,它将导致我的程序崩溃。
答案 0 :(得分:2)
AES-CBC的输出(没有密文窃取)总是16个字节的倍数(32个十六进制字符)。由于您根本不提供十六进制字符(" test"),并且由于字符串不是32个十六进制字符的倍数,因此您将始终看到错误。
所以这个:
000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F
例如有效。
所以你需要检查你得到的是否包含正确的字符并且长度合适。为了确保您没有得到任何填充或内容相关的错误,您需要在最后通过密文计算(十六进制编码的)HMAC值。然后首先检查编码,长度,然后检查HMAC。如果HMAC是正确的,您可以放心,明文在解密后不会包含任何无效信息。
答案 1 :(得分:0)
我也面临同样的问题。我必须通过所有评论来检查答案,@ Alexy Ten的评论帮助了我。因此,为了使@Alexey Ten的答案在下面更加明显,那就是变化。
var crypto = require('crypto');
function encrypt(text){
try{
var cipher = crypto.createCipher('aes-256-cbc','secret key');
var encrypted = cipher.update(text.toString(),'utf8','hex') + cipher.final('hex');
return encrypted;
} catch(exception) {
throw exception;
}
}
function decrypt(text){
try{
var decipher = crypto.createDecipher('aes-256-cbc','secret key');
var decrypted = decipher.update(text.toString(),'hex','utf8') + decipher.final('utf8');
return decrypted ;
} catch(exception) {
throw exception;
}
}