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

我使用这个代码来隐藏/解密string值

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; 

当我试图解密的东西,不encryption例如解密('testing'),它会抛出以下错误:

 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的解决scheme。

真正的问题是我使用这个来解密cookie值。 如果黑客创build了一个“test”值的假cookie,它会使我的程序崩溃。

AES-CBC(无密文窃取)的输出总是16个字节(32个hex字符)的倍数。 由于您根本不提供hex字符(“test”),并且string不是32个hex字符的倍数,所以您将始终看到错误。

所以这:

 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F 

例如是有效的。

所以你需要检查你得到的是包含正确的字符和正确的长度。 为了确保你没有得到任何填充或内容相关的错误,你需要在末尾加上一个在密文上计算的(hex编码的)HMAC值。 然后首先检查编码,长度然后HMAC。 如果HMAC是正确的,你可以放心,明文解密后不会包含任何无效的信息。

我也面临同样的问题。 我必须通过所有的意见来检查答案和@亚历克斯十的评论帮助我。 所以为了让@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; } }