JavaScript
 Computer >> コンピューター >  >> プログラミング >> JavaScript

【Node.js】crypto.createCipheriv()メソッドの使い方を徹底解説

crypto.createCipheriv()メソッドは、指定されたアルゴリズム・キー・初期化ベクトル(iv)に基づいて暗号オブジェクト(Cipherオブジェクト)を作成し、返すNode.jsの暗号化メソッドです。データの暗号化処理を行う際に最もよく使われるAPIの一つであり、AESなどの共通鍵暗号方式を簡単に実装できます。

構文

crypto.createCipheriv(algorithm, key, iv, options)

パラメータ

各引数の詳細は以下の通りです。

  • algorithm ― 暗号オブジェクトを作成する際に使用するアルゴリズム名を指定します。指定可能な値には「aes-192」「aes-256」「aes-256-cbc」などがあります。

  • key ― アルゴリズムおよびivで使用される生の鍵(キー)を指定します。型としてはstringBufferTypedArrayDataViewが利用でき、必要に応じてKeyObject型の秘密鍵オブジェクトを渡すことも可能です。鍵の長さはアルゴリズムによって異なるため注意が必要です。

  • iv ― 初期化ベクトル(Initialization Vector)とも呼ばれる値です。同じ平文から毎回異なる暗号文が生成されるようにするためのもので、秘密情報である必要はありません。型はstringBufferTypedArrayDataViewが指定可能で、暗号方式がivを必要としない場合はnullを渡すことができます。

  • options ― ストリームの動作を制御するための省略可能なパラメータです。ただし、CCMモードやOCBモード(例:「aes-256-ccm」)を使用する場合は必須となります。

使用例1:Bufferを使った基本的な暗号化

まず「createCipheriv.js」という名前のファイルを作成し、以下のコードをコピーしてください。その後、次のコマンドでコードを実行できます。

node createCipheriv.js

createCipheriv.js

// cryptoモジュールを読み込む
const crypto = require('crypto');

// アルゴリズムを初期化
const algorithm = 'aes-256-cbc';

// 鍵を生成(32バイト = AES-256用)
const key = crypto.randomBytes(32);

// ivベクトルを生成(16バイト)
const iv = crypto.randomBytes(16);

// データを暗号化する関数
function encrypt(text) {

  // 上記で定義したパラメータを使ってcipherを作成
  let cipher = crypto.createCipheriv(
    'aes-256-cbc', Buffer.from(key), iv);

  let encrypted = cipher.update(text);
  encrypted = Buffer.concat([encrypted, cipher.final()]);

  // ivと暗号化データを返却
  return { iv: iv.toString('hex'),
    encryptedData: encrypted.toString('hex') };
}

var output = encrypt("TutorialsPoint");
console.log(output);

出力結果

C:\home\node>> node createCipheriv.js
{ iv: '3dd899aa441c00d4d8d2ff95abb2e684',
encryptedData: 'b4985053bc1507fc25a4d99823dc8b03' }

この例では、ランダムに生成した32バイトの鍵と16バイトのivを使い、文字列をAES-256-CBC方式で暗号化しています。復号時には同じ鍵とivが必要になるため、実際のアプリケーションではこれらを安全に管理・保存することが重要です。

使用例2:scryptSyncで鍵を生成してストリーム方式で暗号化

続いて、もう一つの例を見てみましょう。こちらではパスワードからscryptSync()を使って鍵を導出し、ストリームのイベントを利用して暗号化を行います。

// cryptoモジュールを読み込む
const crypto = require('crypto');

// アルゴリズムを初期化
const algorithm = 'aes-192-cbc';

// パスワードを定義・初期化
const password = '123456789'

// scryptSyncでパスワードから鍵を導出
const key = crypto.scryptSync(password, 'TutorialsPoint', 24);

// ivベクトルを初期化(全要素0の16バイト)
const iv = Buffer.alloc(16, 0);

// 定義したパラメータでcipherを作成
const cipher = crypto.createCipheriv(algorithm, key, iv);

let encrypted = '';

// データを読み込みながら暗号化
cipher.on('readable', () => {
    let chunk;
    while (null !== (chunk = cipher.read())) {
      encrypted += chunk.toString('base64');
    }
});

// 終了イベントのハンドリング
cipher.on('end', () => {
    console.log(encrypted);
});

// 暗号化対象のデータを書き込み
cipher.write('TutorialsPoint');
cipher.end();
console.log("Completed... !");

出力結果

C:\home\node>> node createCipheriv.js
Completed... !
uqeQEkXy5dpJjQv+JDvMHw==

この例のように、readableイベントとendイベントを組み合わせることで、大きなデータを少しずつ読み込みながら暗号化するストリーム処理にも対応できます。暗号化結果はBase64形式で出力されます。

まとめ

crypto.createCipheriv()は、Node.jsで共通鍵暗号を実装するための基本となるメソッドです。ポイントを整理すると以下の通りです。

  • アルゴリズム・鍵・ivの3つを引数として受け取り、Cipherオブジェクトを返す
  • 鍵はrandomBytes()scryptSync()で安全に生成するのが推奨される
  • ivは暗号ごとにユニークであるべきで、再利用は避ける
  • CCMやOCBモードを使用する場合はoptionsの指定が必須
  1. Node.jsのcrypto.privateDecrypt()メソッドの使い方を徹底解説

    crypto.privateDecrypt()メソッドは、crypto.publicEncrypt()メソッドを使って対応する公開鍵で事前に暗号化されたデータを、パラメータとして渡された秘密鍵を用いて復号するために使用されます。RSA暗号方式などの公開鍵暗号システムにおいて、安全なデータ復号を実現するための重要なAPIです。 構文 crypto.privateDecrypt(privateKey, buffer) パラメータ このメソッドが受け取る各パラメータの詳細は以下のとおりです。 privateKey(秘密鍵) – 復号に使用する秘密鍵を指定します。Object、String、Bu

  2. Node.jsのcrypto.getHashes()メソッドとは?使い方とサポートされるハッシュアルゴリズム一覧の取得方法

    crypto.getHashes()メソッドは、Node.jsでサポートされているすべてのハッシュアルゴリズムの名前を配列形式で返します。cryptoモジュールには非常に多くのハッシュアルゴリズムが用意されており、その中でも歴史的によく使われてきたのが「MD5(Message-Digest Algorithm 5)」です。ただし、MD5には衝突耐性の脆弱性があるため、現在ではセキュリティ用途にはSHA-256やSHA3系など、より強力なアルゴリズムを使うことが推奨されています。 構文 crypto.getHashes() 引数(パラメータ) このメソッドは、サポートされているハッシュアルゴ