【Node.js】cipher.final()メソッドの使い方と注意点を徹底解説
cipher.final()メソッドは、暗号処理の結果を含むBufferまたは文字列を返すためのメソッドです。Node.jsのcryptoモジュールに組み込まれたCipherクラスが提供する機能の一つで、引数に出力エンコーディングを指定した場合は文字列(String)が、指定しなかった場合はBufferが返されます。また、このメソッドは同一のcipherインスタンスに対して複数回呼び出すことができず、2回目以降の呼び出しではエラーがスローされる点に注意が必要です。
構文
cipher.final([outputEncoding])
パラメータ
このメソッドが受け取るパラメータは以下の通りです。
outputEncoding – 出力データのエンコーディング方式を指定します。データ型は文字列で、
hexやbase64などの値が利用可能です。省略した場合はBufferが返されます。
使用例1:hex・base64形式で結果を取得する
まず「cipherFinal.js」という名前のファイルを作成し、以下のコードをコピーしてください。ファイル作成後、次のコマンドでプログラムを実行できます。
node cipherFinal.js
cipherFinal.js
// cipher.final()メソッドの使用例
// cryptoモジュールを読み込む
const crypto = require('crypto');
// AESアルゴリズムを指定
const algorithm = 'aes-192-cbc';
// 鍵生成に使用するパスワードを設定
const password = '12345678';
// 暗号オブジェクト用の鍵を取得
const key = crypto.scryptSync(password, 'salt', 24);
// 固定のIV(初期化ベクトル)を生成
const iv = Buffer.alloc(16, 0);
// 暗号オブジェクトを作成
const cipher = crypto.createCipheriv(algorithm, key, iv);
const cipher2 = crypto.createCipheriv(algorithm, key, iv);
// outputEncodingを指定しているため、結果は文字列で取得される
let hexValue = cipher.final('hex');
let base64Value = cipher2.final('base64');
// 結果を出力
console.log('Hex String:- ' + hexValue);
console.log('Base64 String:- ' + base64Value)実行結果
C:\home\node>> node cipherFinal.js Hex String:- 8d11772fce59f08e7558db5bf17b3112 Base64 String:- jRF3L85Z8I51WNtb8XsxEg==
outputEncodingに「hex」「base64」をそれぞれ指定することで、対応する形式の文字列として結果が取得できているのがわかります。
使用例2:エンコーディング未指定時の挙動とエラーの発生
続いて、outputEncodingを指定しなかった場合や、final()を複数回呼び出した場合の挙動を確認してみましょう。
// cipher.final()メソッドの使用例
// cryptoモジュールを読み込む
const crypto = require('crypto');
// AESアルゴリズムを指定
const algorithm = 'aes-192-cbc';
// 鍵生成に使用するパスワードを設定
const password = '12345678';
// scryptを使って非同期に鍵を取得
crypto.scrypt(password, 'salt', 24,
{ N: 512 }, (err, key) => {
if (err) throw err;
// 固定のIV(初期化ベクトル)を生成
const iv = Buffer.alloc(16, 0);
// 暗号オブジェクトを作成
const cipher = crypto.createCipheriv(algorithm, key, iv);
// エンコーディング未指定のため、結果はBufferで取得される
let hexValue = cipher.final();
let base64Value = cipher.final('base64');
// 結果を出力
console.log('Buffer:- ' + hexValue);
console.log('Base64 String:- ' + base64Value)
});実行結果
C:\home\node>> node cipherFinal.js
internal/crypto/cipher.js:164
const ret = this._handle.final();
^
Error: Unsupported state
at Cipheriv.final (internal/crypto/cipher.js:164:28)
at Object. (/home/node/test/cipher.js:22:26)
at Module._compile (internal/modules/cjs/loader.js:778:30)
at Object.Module._extensions..js (internal/modules/cjs/loader.js:789:10)
at Module.load (internal/modules/cjs/loader.js:653:32)
at tryModuleLoad (internal/modules/cjs/loader.js:593:12)
at Function.Module._load (internal/modules/cjs/loader.js:585:3)
at Function.Module.runMain (internal/modules/cjs/loader.js:831:12)
at startup (internal/bootstrap/node.js:283:19)
at bootstrapNodeJSCore (internal/bootstrap/node.js:623:3)この例では「Unsupported state」というエラーが発生しています。原因は、同じcipherインスタンスに対してfinal()メソッドを2回呼び出している点にあります。final()はその名の通り暗号処理を「終了」させるためのメソッドであり、一度呼び出すとそのインスタンスは使用済みの状態となります。そのため、同じ鍵に対して再度結果を取得しようとするとエラーになるのです。異なる形式で結果を複数取得したい場合は、例1のように別々のcipherインスタンスを作成するか、一度取得したBufferをtoString('base64')などで変換する方法が有効です。
-
Node.jsのprocess.argv0プロパティとは?使い方とprocess.argv[0]との違いを解説
Node.jsでは、アプリケーション起動時に渡された元のargv[0]の値を、読み取り専用のコピーとして保持するための仕組みとしてprocess.argv0が用意されています。このプロパティを参照することで、Node.jsプロセスが起動された際の実行ファイル名を簡単に取得できます。 構文 process.argv0 パラメータ process.argv0は、保存されているargv[0]の読み取り専用コピーを返すだけのため、ユーザーからの入力(引数)は一切不要です。なお、これは関数ではなくプロパティである点に注意してください。括弧を付けて呼び出すのではなく、単純に参照するだけで値が取得できます。
-
【Node.js入門】process.argvでコマンドライン引数を取得する方法
process.argv は、Node.js プロセスの起動時にコマンドラインから渡されたすべての引数を配列として返すプロパティです。配列の最初の要素には必ず process.execPath と同じ値(Node.js 実行バイナリへの絶対パス)が含まれ、2番目の要素には実行中のJavaScriptファイルのパスが格納されます。それ以降の要素には、ユーザーが指定した追加の引数が順番に並びます。 構文 process.argv パラメータ process.argv は、Node.js プロセス起動時に渡されたコマンドライン引数をすべて取得するためのものであり、ユーザーが何かを入力する必要はありま