📜  Node.js crypto.generateKeyPair() 方法(1)

📅  最后修改于: 2023-12-03 14:44:38.155000             🧑  作者: Mango

Node.js crypto.generateKeyPair() 方法

Node.js 中的 crypto 模块提供了很多加密相关的功能和 API。其中之一就是 generateKeyPair() 方法,它可以用于生成公钥和私钥的密钥对。

方法介绍

generateKeyPair() 方法提供了以下四个参数:

crypto.generateKeyPair(type[, options][, callback])
crypto.generateKeyPairSync(type[, options])

其中,type 表示要使用的加密算法类型,目前支持的值包括 "rsa", "dsa", "ec", 和 "ed25519"options 是一个对象,用于指定选项,具体选项可能与不同的算法相关。callback 是一个回调函数,用于异步获取生成的密钥对。

示例代码

以下是一个使用 generateKeyPair() 方法生成 RSA 密钥对的示例代码。

const crypto = require('crypto');

const options = {
  modulusLength: 4096,
  publicKeyEncoding: {
    type: 'pkcs1',
    format: 'pem'
  },
  privateKeyEncoding: {
    type: 'pkcs1',
    format: 'pem'
  }
};

crypto.generateKeyPair('rsa', options, (err, publicKey, privateKey) => {
  if (err) throw err;
  console.log('RSA key pair generated:');
  console.log(`Public key: ${publicKey}`);
  console.log(`Private key: ${privateKey}`);
});

这段代码通过传入选项对象,指定了生成密钥对时所使用的参数。其中,modulusLength 表示密钥的长度为 4096,publicKeyEncodingprivateKeyEncoding 分别指定了公钥和私钥使用的编码格式和类型。

运行上述代码,就可以看到生成的 RSA 密钥对的公钥和私钥的 PEM 格式的字符串,如下所示:

RSA key pair generated:
Public key: -----BEGIN RSA PUBLIC KEY-----
MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAtKPNfl2Sf8vbtUgs/iLt
...
-----END RSA PUBLIC KEY-----

Private key: -----BEGIN RSA PRIVATE KEY-----
MIIJKAIBAAKCAgEAtKPNfl2Sf8vbtUgs/iLt...
-----END RSA PRIVATE KEY-----
异步和同步调用

generateKeyPair() 方法提供了两种调用方式:异步和同步。上文中的示例代码是异步调用的,但是也可以使用同步调用方法 generateKeyPairSync()。下面是同步调用的示例代码:

const crypto = require('crypto');

const options = {
  modulusLength: 4096,
  publicKeyEncoding: {
    type: 'pkcs1',
    format: 'pem'
  },
  privateKeyEncoding: {
    type: 'pkcs1',
    format: 'pem'
  }
};

const { publicKey, privateKey } = crypto.generateKeyPairSync('rsa', options);

console.log('RSA key pair generated:');
console.log(`Public key: ${publicKey}`);
console.log(`Private key: ${privateKey}`);

两个方法的区别就在于,异步调用需要传入回调函数,而同步调用则直接返回密钥对对象(包括公钥和私钥)。

总结

generateKeyPair() 方法是一个非常实用的加密工具。通过它,我们可以方便地生成密钥对,用于各种加密和解密场景。在使用过程中,需要关注选项对象中的各个属性的含义和用法。同时,异步和同步调用方法也需要根据具体场景进行选择。