我在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字符串。
感谢您的帮助。
答案 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字符串。