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文字列のみを受け取ります。
どんな助けでもありがたいです。
32バイト(256ビット)のキー長が必要です。したがって、キーラインを次のように変更すると、
let key = crypto.createHash('sha256').update(String(secret)).digest('base64').substr(0, 32);
それが動作します。
キーを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);
ベース64の文字列を最初の32バイトに切り分けるよりも良い別の方法は、digest()呼び出しの前にキーの値を単に返すことです。
let key = crypto.createHash('sha256').update(String(secret))
キーがbase 64に変換された後で32バイトにカットされた場合、そのチョップされた文字列は無効なbase64文字列です。