crypto.createCipheriv中的密钥长度无效

时间:2018-06-21 07:50:26

标签: javascript node.js cryptography

我在NodeJS v8.11.0中使用以下代码生成了base64编码的密钥:

const secret = 'shezhuansauce';
const key = crypto.createHash('sha256').update(String(secret)).digest('base64');
//output is REtgV24bDB7xQYoMuypiBASMEaJbc59nJWChoXbbmsA=

使用密钥,我尝试对字符串进行加密:

var tobeEncrypted = 'some secret string';
const iv = crypto.randomBytes(16).toString('hex').slice(0, 16);
const cipher = crypto.createCipheriv('aes-256-ctr', key, iv);
const encrypted = cipher.update(String(tobeEncrypted), 'utf8', 'hex') + cipher.final('hex');
console.log(encrypted);

但是,我收到一个错误:

crypto.js:219
this._handle.initiv(cipher, toBuf(key), toBuf(iv));
           ^
Error: Invalid key length

密钥必须为base64字符串,因为我会将其存储在Cloud服务中,并且只接收base64字符串。

感谢您的帮助。

3 个答案:

答案 0 :(得分:4)

您需要的密钥长度为32字节(256位)。 因此,如果您将关键行更改为:

let key = crypto.createHash('sha256').update(String(secret)).digest('base64').substr(0, 32);

它将起作用。

答案 1 :(得分:1)

您说您在BASE 64中存储了一个密钥,该密钥为256位(或32字节)(我们看到您已计算出sha256),因此只需获取该base64密钥,即可轻松获得字节,如下所示:

const key_in_bytes = Buffer.from(BASE_64_KEY, 'base64')

您可以使用以下字节为单位的密钥:

const cipher = crypto.createCipheriv('aes-256-ctr', key_in_bytes, iv);

答案 2 :(得分:0)

另一种可能比将基础64字符串切成前32个字节更好的替代方法是,在digest()调用之前简单地返回键的值:

let key = crypto.createHash('sha256').update(String(secret))

如果将密钥转换为基数64后将其切为32个字节,则该切碎的字符串为无效的base64字符串。