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

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

crypto.randomFillSync()メソッドは、引数として受け取ったバッファに暗号学的に強度の高いランダムな値(乱数)を書き込み、そのバッファを戻り値として返します。メソッド名に「Sync」と付いている通り、処理は同期的に実行されます。このメソッドは、セキュリティトークンや識別子の生成など、予測不可能な乱数が必要な場面で活用されます。

構文

crypto.randomFillSync(buffer, [offset], [size])

パラメータ

各パラメータの詳細は以下の通りです。なお、第2引数のoffsetと第3引数のsizeは省略可能です。

  • buffer – 乱数を書き込む対象のデータ本体です。指定できる型はstring、TypedArray、Buffer、ArrayBuffer、DataViewのいずれかです。バッファのサイズは2**31-1(約2GB)を超えることはできません。

  • offset – 書き込みを開始する位置(オフセット)です。デフォルト値は0で、バッファの先頭から書き込まれます。

  • size – オフセット以降に書き込むバイト数です。(buffer.length - offset)より大きい値は指定できず、上限は2**31-1です。

使用例①:Bufferに対する基本操作

まずは最もシンプルな使い方を確認します。「randomFillSync.js」というファイルを作成し、以下のコードをコピーしてください。作成後、次のコマンドで実行できます。

node randomFillSync.js

randomFillSync.js

// crypto.randomFillSync() サンプルデモ

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

// 15バイトのバッファを確保
const buffer = Buffer.alloc(15);

// バッファのみ指定:全体に乱数が書き込まれる
console.log(crypto.randomFillSync(buffer).toString('base64'));

// バッファ+オフセット:先頭4バイトをスキップして書き込み
crypto.randomFillSync(buffer, 4);
console.log(buffer.toString('base64'));

// バッファ+オフセット+サイズ:位置4から4バイトだけ上書き
crypto.randomFillSync(buffer, 4, 4);
console.log(buffer.toString('base64'));

出力結果

C:\home\node>> node randomFillSync.js
wVBZ+i/nvmL3Ce4kBOl0
wVBZ+hkP5DB/4Ci8yTGs
wVBZ+stVWJZ/4Ci8yTGs

出力結果から挙動がよく分かります。1回目の呼び出しではバッファ全体が新たな乱数で埋められます。2回目ではオフセット4以降のみが更新され、先頭の「wVBZ+」部分はそのまま維持されています。さらに3回目では、位置4から4バイト分だけが上書きされ、それ以外の領域は保持されています。

使用例②:TypedArray・DataViewに対する操作

randomFillSync()はBuffer以外にも、Int8ArrayやBigInt64ArrayといったTypedArray、さらにはDataViewにも対応しています。続いて、それぞれの型を扱う例を見てみましょう。

// crypto.randomFillSync() サンプルデモ

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

// TypedArrayインスタンス(Int8Array)を作成
const data = new Int8Array(16);

// buffer・offset・sizeを組み合わせて使用
console.log(Buffer.from(crypto.randomFillSync(data).buffer, data.byteOffset, data.byteLength).toString('base64'));

console.log();

// TypedArrayインスタンス(BigInt64Array)を作成
const data2 = new BigInt64Array(4);
console.log(Buffer.from(crypto.randomFillSync(data2).buffer, data2.byteOffset, data2.byteLength).toString('ascii'));

console.log();

// DataViewインスタンスを作成
const data3 = new DataView(new ArrayBuffer(7));
console.log(Buffer.from(crypto.randomFillSync(data3).buffer, data3.byteOffset, data3.byteLength).toString('hex'));

出力結果

C:\home\node>> node randomFillSync.js
iNm8tiwDATcV6I8xjTSTbQ==

ra+I=(6&Xse"hjw?!EO?D#S7M

d957fb1dbdfa00

このように、Buffer.from()とbyteOffset・byteLengthを組み合わせることで、TypedArrayやDataViewに書き込まれた乱数データも簡単に文字列形式で確認できます。

まとめ

crypto.randomFillSync()は、バッファに暗号学的に安全な乱数を同期的に書き込める便利なメソッドです。BufferだけでなくTypedArrayやDataViewも引数にでき、offsetとsizeを指定すればバッファの一部分だけを選択的に更新できます。ただし同期処理のため、実行中はイベントループがブロックされる点には注意が必要です。大容量データや高負荷な環境では、非同期版であるcrypto.randomFill()の利用も検討すると良いでしょう。


  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() 引数(パラメータ) このメソッドは、サポートされているハッシュアルゴ