util.js
代码功能说明:
- generateKeys: 生成一对RSA密钥(公钥和私钥),并将它们分别保存到指定的文件中。
- encrypt: 使用公钥对明文进行加密,返回base64格式的密文。
- 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
。keyPath
、pubKeyPath
、priKeyPath
:这些路径用于指定密钥文件的存放位置,通常用于加密或身份验证。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
代码功能说明:
- **
getPublicKeySync
**:同步读取公钥文件并返回其内容。如果文件不存在或读取失败,会抛出异常。 - **
getPublicKey
**:异步读取公钥文件。如果读取失败(例如文件不存在),则调用generateKeys
生成新的密钥对,然后重新读取并返回公钥内容。 - **
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,
};