Nodejs使用加密错误解密错误的最终块长度

时间:2014-04-16 13:48:46

标签: node.js encryption cryptography

我使用此代码来加密/解密字符串值

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,它将导致我的程序崩溃。

2 个答案:

答案 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;
   }
}