📜  Node.js crypto.generateKeyPair() 方法

📅  最后修改于: 2022-05-13 01:56:38.837000             🧑  作者: Mango

Node.js crypto.generateKeyPair() 方法

crypto.generateKeyPair() 方法是加密模块的内置应用程序编程接口,用于生成指定类型的新非对称密钥对。例如,当前支持的密钥类型有RSA、DSA、EC、Ed25519、Ed448、X25519、X448 和 DH 。此外,如果此处说明了选项的publicKeyEncodingprivateKeyEncoding ,则此函数的作用就像在其输出上调用了keyObject.export() 。否则,键的特定部分将作为KeyObject返回。
但是,建议将公钥编码为“spki”,将私钥编码为“pkcs8”,并进行加密以进行长期存储。

句法:

crypto.generateKeyPair( type, options, callback )

参数:此方法接受三个参数,如上所述,如下所述:

  • type:它包含一个字符串,并且必须包含以下一种或多种算法: 'rsa'、'dsa'、'ec'、'ed25519'、'ed448'、'x25519'、'x448'或'dh' .
  • 选项:是对象类型。它可以保存以下参数:
    1. 模数长度:它包含一个数字。它是以比特为单位的密钥大小,仅适用于 RSA 和 DSA 算法。
    2. publicExponent:它包含一个数字。它是 RSA 算法的公共指数。默认值为 0x10001。
    3. divisorLength:它包含一个数字。它是 DSA 算法中q的大小。
    4. namedCurve:它包含一个字符串。它是 EC 算法中要使用的曲线的名称。
    5. prime:它拥有一个缓冲区。它是 DH 算法的主要参数。
    6. primeLength:它包含一个数字。它是 DH 算法的素数长度(以比特为单位)。
    7. 生成器:它包含一个数字。它是DH算法的自定义生成器。它的默认值为 2。
    8. groupName:它包含字符串。它是 DH 算法的 Diffie-Hellman 组名。
    9. publicKeyEncoding:它包含一个字符串。
    10. privateKeyEncoding:它持有一个对象。
  • callback:它是一个函数,带有参数publicKey、privateKey 和 err
    1. err:保存错误。
    2. publicKey:它包含一个字符串、缓冲区或 KeyObject。
    3. privateKey:保存字符串、缓冲区或 KeyObject。

返回值:它返回给定类型的新非对称密钥对。

下面的例子说明了在 Node.js 中crypto.generateKeyPair() 方法的使用:

示例 1:

// Node.js program to demonstrate the
// crypto.generateKeyPair() method
  
// Including generateKeyPair from crypto module
const { generateKeyPair } = require('crypto');
  
// Calling generateKeyPair() method
// with its parameters
generateKeyPair('rsa', {
  modulusLength: 530,    // options
  publicExponent: 0x10101,
  publicKeyEncoding: {
    type: 'pkcs1',
    format: 'der'
  },
  privateKeyEncoding: {
    type: 'pkcs8',
    format: 'der',
    cipher: 'aes-192-cbc',
    passphrase: 'GeeksforGeeks is a CS-Portal!'
  }
}, (err, publicKey, privateKey) => { // Callback function
       if(!err)
       {
         // Prints new asymmetric key pair
         console.log("Public Key is : ", publicKey);
         console.log();
         console.log("Private Key is: ", privateKey);
       }
       else
       {
         // Prints error
         console.log("Errr is: ", err);
       }
         
  });

输出:

Public Key is : 

Private Key is: 

示例 2:

// Node.js program to demonstrate the
// crypto.generateKeyPair() method
  
// Including generateKeyPair from crypto module
const { generateKeyPair } = require('crypto');
  
// Calling generateKeyPair() method
// with its parameters
generateKeyPair('ec', {
  namedCurve: 'secp256k1',   // Options
  publicKeyEncoding: {
    type: 'spki',
    format: 'der'
  },
  privateKeyEncoding: {
    type: 'pkcs8',
    format: 'der'
  }
},
 (err, publicKey, privateKey) => { // Callback function
       if(!err)
       {
         // Prints new asymmetric key
         // pair after encoding
         console.log("Public Key is: ",
                  publicKey.toString('hex'));
         console.log();
         console.log("Private Key is: ",
                 privateKey.toString('hex'));
       }
       else
       {
         // Prints error
         console.log("Errr is: ", err);
       }
         
  });

输出:

Public Key is:  3056301006072a8648ce3d020106052b8104000a0342000499c5f442c3264bcdfb093b0bc820e3f0f6546972856ebec2f8ccc03f49abdb47ffcfcaf4f37e0ec53050760e74014767e30a8a3e891f4db8c83fa27627898f15

Private Key is:  308184020100301006072a8648ce3d020106052b8104000a046d306b0201010420326b340a964512bfc3e010850ff05e077b2f016fce9eded11f40643e4231efc4a1440342000499c5f442c3264bcdfb093b0bc820e3f0f6546972856ebec2f8ccc03f49abdb47ffcfcaf4f37e0ec53050760e74014767e30a8a3e891f4db8c83fa27627898f15

参考: https://nodejs.org/api/crypto.html#crypto_crypto_generatekeypair_type_options_callback