Node.jsのcrypto.generateKeyPair()メソッドで非対称鍵ペアを生成する方法
crypto.generateKeyPair()メソッドは、指定した種類の新しい非対称鍵ペア(公開鍵と秘密鍵のペア)を生成するために使用されます。鍵ペアの生成に対応しているタイプは、RSA、DSA、EC、Ed25519、Ed448、X25519、X448、DHです。publicKeyEncodingまたはprivateKeyEncodingが指定された場合、この関数は結果に対してkeyObject.export()を呼び出した場合と同じように動作し、エンコードされた鍵データを返します。指定されていない場合は、keyObjectの該当する部分がそのまま返されます。
構文
crypto.generateKeyPair(type, options, callback)
パラメータ
各パラメータの詳細は以下の通りです。
type ― 鍵を生成する対象のタイプを文字列で指定します。「RSA」「DSA」「EC」「Ed25519」「Ed448」「X25519」「X448」「DH」から選択できます。
options ― 以下のパラメータを含むことができるオプションオブジェクトです。
modulusLength ― RSAやDSAにおける鍵サイズをビット単位で指定します。
publicExponent ― RSAアルゴリズムの公開指数値を指定します。デフォルト値は0x10001です。
divisorLength ― qのサイズをビット単位で指定します。
namedCurve ― 使用する曲線の名前を指定します(ECタイプ用)。
prime ― DHなどのタイプにおける素数パラメータを指定します。
primeLength ― 素数の長さをビット単位で指定します。
generator ― カスタムジェネレータの値を指定します。デフォルトは2です。
groupName ― DHアルゴリズムのディフィー・ヘルマン(Diffie-Hellman)グループ名を指定します。
publicKeyEncoding ― 公開鍵のエンコーディング方式(type・formatなど)をオブジェクトで指定します。
privateKeyEncoding ― 秘密鍵のエンコーディング方式をオブジェクトで指定します。cipherとpassphraseを組み合わせることで、秘密鍵を暗号化して取得することも可能です。
callback ― 鍵の生成完了時に呼び出されるコールバック関数です。以下の引数を受け取ります。
err ― エラーが発生した場合にエラーオブジェクトが渡されます。
publicKey ― 生成された公開鍵の値が渡されます。
privateKey ― 生成された秘密鍵の値が渡されます。
使用例
「generateKeyPair.js」という名前のファイルを作成し、以下のコードスニペットをコピー&ペーストしてください。ファイル作成後、次のコマンドでコードを実行できます。
node generateKeyPair.js
例1:RSA鍵ペアの生成
// Node.jsプログラム:crypto.generateKeyPair()メソッドの動作を確認する
// cryptoモジュールからgenerateKeyPairをインポート
const { generateKeyPair } = require('crypto');
// 指定したパラメータでgenerateKeyPair()メソッドを呼び出す
generateKeyPair('rsa', {
modulusLength: 530, // 鍵サイズ(ビット)
publicExponent: 0x10101,
publicKeyEncoding: {
type: 'pkcs1',
format: 'der'
},
privateKeyEncoding: {
type: 'pkcs8',
format: 'der',
cipher: 'aes-192-cbc',
passphrase: 'my-secret-passphrase'
}
}, (err, publicKey, privateKey) => { // コールバック関数
if (!err) {
// 生成された非対称鍵ペアを出力
console.log('公開鍵: ', publicKey);
console.log();
console.log('秘密鍵: ', privateKey);
} else {
// エラーが発生した場合は出力
console.log('エラー: ', err);
}
});
出力結果
C:\home\node>> node generateKeyPair.js Public Key is: <Buffer 30 4a 02 43 03 43 66 5a e1 25 0d d8 c4 fe e3 a0 77 ea e4 e7 20 78 8c eb a7 a4 f6 85 f0 45 fc 7b 46 d7 3e 5e e3 8b a1 16 e5 59 e8 79 69 65 54 00 6c 89 ... > Private Key is: <Buffer 30 82 01 cd 30 57 06 09 2a 86 48 86 f7 0d 01 05 0d 30 4a 30 29 06 09 2a 86 48 86 f7 0d 01 05 0c 30 1c 04 08 1e a2 b4 ea ce 50 0e 80 02 02 08 00 30 0c ... >
例2:EC(楕円曲線)鍵ペアの生成
// Node.jsプログラム:crypto.generateKeyPair()メソッドの動作を確認する
// cryptoモジュールからgenerateKeyPairをインポート
const { generateKeyPair } = require('crypto');
// 指定したパラメータでgenerateKeyPair()メソッドを呼び出す
generateKeyPair('ec', {
namedCurve: 'secp256k1', // 使用する曲線名
publicKeyEncoding: {
type: 'spki',
format: 'der'
},
privateKeyEncoding: {
type: 'pkcs8',
format: 'der'
}
}, (err, publicKey, privateKey) => { // コールバック関数
if (!err) {
// 生成された非対称鍵ペアを出力
console.log('公開鍵: ', publicKey);
console.log('公開鍵(16進数表記): ', publicKey.toString('hex'));
console.log();
console.log('秘密鍵: ', privateKey);
console.log('秘密鍵(16進数表記): ', privateKey.toString('hex'));
} else {
// エラーが発生した場合は出力
console.log('エラー: ', err);
}
});
出力結果
C:\home\node>> node generateKeyPair.js Public Key is: <Buffer 30 56 30 10 06 07 2a 86 48 ce 3d 02 01 06 05 2b 81 04 00 0a 03 42 00 04 d1 d0 0b 7e f7 e3 3e cf d8 08 2a 20 a8 5e 52 be ca 56 29 42 c3 6b 9f d3 15 7c ... > Public Key in hex is: 3056301006072a8648ce3d020106052b8104000a03420004d1d00b7ef7e33ecfd8082a20a85e52 beca562942c36b9fd3157cf98b03b41ecc4b4e13b4cd5cd35814383ee76afabaf794faf6f31bc8 c9f7007748f74767677c Private Key is: <Buffer 30 81 84 02 01 00 30 10 06 07 2a 86 48 ce 3d 02 01 06 05 2b 81 04 00 0a 04 6d 30 6b 02 01 01 04 20 05 01 a1 d5 80 f7 65 56 6f a3 3a 05 d3 6d ec 82 ad ... > Private Key in hex is: 308184020100301006072a8648ce3d020106052b8104000a046d306b02010104200501a1d580f7 65566fa33a05d36dec82ad590ff8697d182ddca6b881acfbadd1a14403420004d1d00b7ef7e33e cfd8082a20a85e52beca562942c36b9fd3157cf98b03b41ecc4b4e13b4cd5cd35814383ee76afa baf794faf6f31bc8c9f7007748f74767677c
補足
サンプルコードでは動作確認をしやすくするため、あえて小さなmodulusLength(530ビット)を指定しています。しかし実際の運用環境では、RSAの鍵長として2048ビット以上(セキュリティ強度を高めたい場合は4096ビット)を使用することを強く推奨します。また、秘密鍵を暗号化して保存したい場合は、例1のようにprivateKeyEncodingにcipherとpassphraseを指定することで、PKCS#8形式で暗号化された秘密鍵を取得できます。
-
Node.jsのcrypto.privateDecrypt()メソッドの使い方を徹底解説
crypto.privateDecrypt()メソッドは、crypto.publicEncrypt()メソッドを使って対応する公開鍵で事前に暗号化されたデータを、パラメータとして渡された秘密鍵を用いて復号するために使用されます。RSA暗号方式などの公開鍵暗号システムにおいて、安全なデータ復号を実現するための重要なAPIです。 構文 crypto.privateDecrypt(privateKey, buffer) パラメータ このメソッドが受け取る各パラメータの詳細は以下のとおりです。 privateKey(秘密鍵) – 復号に使用する秘密鍵を指定します。Object、String、Bu
-
Node.jsのcrypto.getHashes()メソッドとは?使い方とサポートされるハッシュアルゴリズム一覧の取得方法
crypto.getHashes()メソッドは、Node.jsでサポートされているすべてのハッシュアルゴリズムの名前を配列形式で返します。cryptoモジュールには非常に多くのハッシュアルゴリズムが用意されており、その中でも歴史的によく使われてきたのが「MD5(Message-Digest Algorithm 5)」です。ただし、MD5には衝突耐性の脆弱性があるため、現在ではセキュリティ用途にはSHA-256やSHA3系など、より強力なアルゴリズムを使うことが推奨されています。 構文 crypto.getHashes() 引数(パラメータ) このメソッドは、サポートされているハッシュアルゴ