代码示例如下:
var crypto = require('crypto');
var key = 'ExchangePasswordPasswordExchange';
var plaintext = '150.01';
var iv = new Buffer(crypto.randomBytes(16))
ivstring = iv.toString('hex');
var cipher = crypto.createCipheriv('aes-256-cbc', key, ivstring)
var decipher = crypto.createDecipheriv('aes-256-cbc', key,ivstring);
cipher.update(plaintext, 'utf8', 'base64');
var encryptedPassword = cipher.final('base64');
获得无效IV长度的错误。
答案 0 :(得分:6)
来自https://github.com/nodejs/node/issues/6696#issuecomment-218575039 -
加密模块changed in v6.0.0 from binary to utf8使用的默认字符串编码。所以你的二进制字符串正在被解释 因为utf8并且很可能在此期间变得超过16个字节 转换过程(而不是小于16个字节)由于无效 添加utf8字符字节。
修改代码以使ivstring
长度始终为16个字符可以解决您的问题。
var ivstring = iv.toString('hex').slice(0, 16);
答案 1 :(得分:3)
上面的答案增加了不必要的开销,因为您将每个字节转换为十六进制表示形式,所需的字节数是原来的两倍,因此生成的字节数仅为一半
var crypto = require('crypto');
var key = 'ExchangePasswordPasswordExchange';
var plaintext = '150.01';
var iv = new Buffer(crypto.randomBytes(8))
ivstring = iv.toString('hex');
var cipher = crypto.createCipheriv('aes-256-cbc', key, ivstring)
var decipher = crypto.createDecipheriv('aes-256-cbc', key,ivstring);
cipher.update(plaintext, 'utf8', 'base64');
var encryptedPassword = cipher.final('base64');
答案 2 :(得分:0)
在Node.js 10中,我必须使用12个字节的字符串才能正常工作... const iv = crypto.pseudoRandomBytes(6).toString('hex');
。 16个字节给我一个错误。我在全局运行Node.js 10并将其上传到带有Node.js 8的Cloud Functions服务器时遇到了这个问题。由于Cloud Functions在Beta中具有Node.js 10,所以我切换到该版本,现在它可以与12个字节的字符串。在Cloud Functions服务器上的Node.js 8上,它甚至无法使用16字节的字符串...
答案 3 :(得分:-5)
如果您使用的是旧令牌,请尝试在客户端注销/登录。
此外,针对此错误,使用401未经授权的代码引发错误