web-dev-qa-db-ja.com

crypto.createCipherivのキーの長さが無効です

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文字列である必要があり、base64文字列のみを受け取ります。

どんな助けでもありがたいです。

6
user1055010

32バイト(256ビット)のキー長が必要です。したがって、キーラインを次のように変更すると、

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

それが動作します。

10
tur1ng

キーを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);
1
Truly

ベース64の文字列を最初の32バイトに切り分けるよりも良い別の方法は、digest()呼び出しの前にキーの値を単に返すことです。

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

キーがbase 64に変換された後で32バイトにカットされた場合、そのチョップされた文字列は無効なbase64文字列です。

0
Leo