NodeRSA创建公钥秘钥,加密解密

util.js

代码功能说明:

  1. generateKeys: 生成一对RSA密钥(公钥和私钥),并将它们分别保存到指定的文件中。
  2. encrypt: 使用公钥对明文进行加密,返回base64格式的密文。
  3. decrypt: 使用私钥对密文进行解密,返回UTF-8格式的明文。

使用场景:

  • 该代码可以用于在Node.js环境中实现RSA非对称加密和解密,常用于数据加密传输、数字签名等场景。

代码部分:

const fs = require('fs'); // 引入文件系统模块,用于读写文件
const path = require('path'); // 引入路径模块,用于处理文件路径
const NodeRSA = require('node-rsa'); // 引入NodeRSA模块,用于生成密钥对、加密和解密
const { host, root, port, keyPath, publickKeyPath, privateKeyPath, userPath } = require('../config'); // 从配置文件中引入私钥和公钥的路径

// 生成密钥对
function generateKeys() {
  const newkey = new NodeRSA({ b: 512 }); // 创建一个512位的RSA密钥实例
  newkey.setOptions({ encryptionScheme: 'pkcs1' }); // 设置加密方案为pkcs1
  let public_key = newkey.exportKey('pkcs8-public'); // 导出公钥
  let private_key = newkey.exportKey('pkcs8-private'); // 导出私钥
  // console.log(public_key, private_key);
  fs.mkdirSync(keyPath, { recursive: true }); // mkdirSync在这里要同步创建才行
  fs.writeFileSync(privateKeyPath, private_key); // 将私钥写入指定路径的文件
  fs.writeFileSync(publickKeyPath, public_key); // 将公钥写入指定路径的文件
}

// 加密函数
function encrypt(plain) {
  let public_key = fs.readFileSync(pubKeyPath, 'utf8'); // 从文件中读取公钥
  const nodersa = new NodeRSA(public_key); // 使用公钥创建RSA实例
  nodersa.setOptions({ encryptionScheme: 'pkcs1' }); // 设置加密方案为pkcs1
  const encrypted = nodersa.encrypt(plain, 'base64'); // 使用公钥加密明文,并返回base64格式的密文
  console.log(encrypted); // 打印加密后的密文
  return encrypted; // 返回加密后的密文
}

// 解密函数
function decrypt(cipher) {
  let private_key = fs.readFileSync(priKeyPath, 'utf8'); // 从文件中读取私钥
  let prikey = new NodeRSA(private_key); // 使用私钥创建RSA实例
  prikey.setOptions({ encryptionScheme: 'pkcs1' }); // 设置加密方案为pkcs1
  return prikey.decrypt(cipher, 'utf8'); // 使用私钥解密密文,并返回UTF-8格式的明文
}

// 导出模块中的函数
module.exports = {
  generateKeys,
  encrypt,
  decrypt,
};

config.js

解释

  • host:服务器监听的IP地址,127.0.0.1表示本地回环地址,即服务器只在本机运行。
  • root:应用程序的根目录,process.cwd()返回当前工作目录的路径。
  • port:服务器监听的端口号,设置为3000
  • keyPathpubKeyPathpriKeyPath:这些路径用于指定密钥文件的存放位置,通常用于加密或身份验证。
  • userPath:用户数据文件的路径,用于存储用户相关信息。

这些配置项可以根据实际需求进行调整

// 引入Node.js的path模块,用于处理文件路径
const path = require("path");

// 导出一个配置对象,包含服务器和应用程序的各种设置
module.exports = {
  // 服务器监听的IP地址,这里设置为本地回环地址(即本机)
  host: '127.0.0.1',

  // 应用程序的根目录,使用Node.js的process.cwd()方法获取当前工作目录
  root: process.cwd(),

  // 服务器监听的端口号,这里设置为3000
  port: 3000,

  // 密钥文件的存放路径,使用path.join()方法将当前工作目录与相对路径拼接
  keyPath: path.join(process.cwd(), '/auth'),

  // 公钥文件的路径,同样使用path.join()方法拼接路径
  pubKeyPath: path.join(process.cwd(), '/auth/public.cer'),

  // 私钥文件的路径,使用path.join()方法拼接路径
  priKeyPath: path.join(process.cwd(), '/auth/private.cer'),

  // 用户数据文件的路径,使用path.join()方法拼接路径
  userPath: path.join(process.cwd(), '/user/user.json')
};

rsaControl.js

代码功能说明:

  1. ​**getPublicKeySync**:同步读取公钥文件并返回其内容。如果文件不存在或读取失败,会抛出异常。
  2. ​**getPublicKey**:异步读取公钥文件。如果读取失败(例如文件不存在),则调用 generateKeys 生成新的密钥对,然后重新读取并返回公钥内容。
  3. ​**getPrivateKey**:异步读取私钥文件。如果读取失败(例如文件不存在),则调用 generateKeys 生成新的密钥对,然后重新读取并返回私钥内容。

使用场景:

  • 在需要获取公钥或私钥时,可以使用这些函数来确保密钥文件存在并且内容正确。
  • 如果密钥文件不存在或损坏,会自动生成新的密钥对,确保程序的正常运行。
const fsSync = require('fs'); // 同步文件系统模块
const fs = require('fs').promises; // 异步文件系统模块(基于Promise)
const { host, root, port, keyPath, publickKeyPath, privateKeyPath, userPath } = require('../config'); // 导入配置文件中的路径和参数
const { generateKeys, encrypt, decrypt } = require('../util/util'); // 导入加密工具函数

// 同步获取公钥
function getPublicKeySync() {
  return fsSync.readFileSync(publickKeyPath, 'utf8');
}

// 异步获取公钥
async function getPublicKey() {
  let key;
  try {
    key = await fs.readFile(publickKeyPath, 'utf8'); // 异步读取公钥文件
  } catch (error) {
    generateKeys(); // 如果读取失败,生成新的密钥对
    key = await fs.readFile(publickKeyPath, 'utf8'); // 重新读取公钥文件
  }
  return key; // 返回公钥内容
}

// 异步获取私钥
async function getPrivateKey() {
  let key;
  try {
    key = await fs.readFile(privateKeyPath, 'utf8'); // 异步读取私钥文件
  } catch (error) {
    generateKeys(); // 如果读取失败,生成新的密钥对
    key = await fs.readFile(privateKeyPath, 'utf8'); // 重新读取私钥文件
  }
  return key; // 返回私钥内容
}

// 导出模块中的函数
module.exports = {
  getPublicKeySync,
  getPublicKey,
  getPrivateKey,
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值