node.js内置模块之crypto 模块及作用详解

 更新时间:2025年11月15日 11:17:30   作者:百***3533  
在Node.js中,crypto模块提供了多种加密功能,包括哈希、对称加密、非对称加密和数字签名等,通过crypto模块,可以进行各种加密和解密操作,保护敏感数据的安全性,本文给大家介绍node.js内置模块之crypto 模块及作用详解,感兴趣的朋友跟随小编一起看看吧

crypto 模块的作用

在 Node.js 中,crypto 模块提供了多种加密功能,包括哈希、对称加密、非对称加密和数字签名等。通过 crypto 模块,可以进行各种加密和解密操作,保护敏感数据的安全性。

crypto 模块

1. 哈希算法(Hashing)

哈希函数(如 SHA、MD5 等)用于将输入数据映射为一个固定长度的字符串(哈希值)。它是单向的,不可逆的,通常用于数据完整性验证。

  • createHash(algorithm):创建一个哈希对象,algorithm指定使用的哈希算法(例如'sha256','md5')。
  • update(data):向哈希对象添加数据,可以调用多次。
  • digest(encoding):返回哈希值,encoding可以是'hex'、'base64'或'binary'。

示例:生成 SHA-256 哈希值

const hash = crypto.createHash('sha256');
hash.update('Hello, world!');
const result = hash.digest('hex');
console.log(result);  // 输出 SHA-256 哈希值

2、加密与解密(Encryption and Decryption)

对称加密

对称加密使用相同的密钥进行加密和解密。crypto 模块支持多种对称加密算法,如 AES(AES-128、AES-256)等。

  • createCipheriv(algorithm, key, iv):创建加密对象,algorithm是加密算法,key是密钥,iv是初始化向量(IV)。
  • update(data, inputEncoding, outputEncoding):将明文数据输入并指定编码,返回加密数据。
  • final(outputEncoding):返回最后的加密数据。

示例:使用 AES-256-CBC 加密和解密

const algorithm = 'aes-256-cbc';
const key = crypto.randomBytes(32);  // 32 字节的密钥
const iv = crypto.randomBytes(16);   // 16 字节的初始化向量
// 加密
const cipher = crypto.createCipheriv(algorithm, key, iv);
let encrypted = cipher.update('Hello, world!', 'utf8', 'hex');
encrypted += cipher.final('hex');
console.log('Encrypted:', encrypted);
// 解密
const decipher = crypto.createDecipheriv(algorithm, key, iv);
let decrypted = decipher.update(encrypted, 'hex', 'utf8');
decrypted += decipher.final('utf8');
console.log('Decrypted:', decrypted);

非对称加密

非对称加密使用一对密钥——公钥和私钥。公钥用于加密,私钥用于解密。

  • generateKeyPairSync(type, options):同步生成公钥和私钥对,type指定密钥类型(如'rsa'),options指定密钥的参数。
  • publicEncrypt(publicKey, data):使用公钥对数据进行加密。
  • privateDecrypt(privateKey, data):使用私钥对数据进行解密。

示例:使用 RSA 非对称加密

const { publicKey, privateKey } = crypto.generateKeyPairSync('rsa', {
  modulusLength: 2048,  // 公钥的位数
});
// 使用公钥加密
const encrypted = crypto.publicEncrypt(publicKey, Buffer.from('Hello, world!'));
console.log('Encrypted:', encrypted.toString('hex'));
// 使用私钥解密
const decrypted = crypto.privateDecrypt(privateKey, encrypted);
console.log('Decrypted:', decrypted.toString());

3. HMAC(Hash-based Message Authentication Code)

HMAC 是一种基于哈希的消息认证码,用于验证消息的完整性和真实性。它结合了哈希函数和密钥,能够防止中间人攻击。

  • createHmac(algorithm, key):创建 HMAC 对象,algorithm指定哈希算法(如'sha256'),key是密钥。
  • update(data):向 HMAC 对象输入数据。
  • digest(encoding):返回 HMAC 的结果,通常是'hex'或'base64'编码。

示例:生成 HMAC

const secret = 'my-secret-key';
const hmac = crypto.createHmac('sha256', secret);
hmac.update('Hello, world!');
const result = hmac.digest('hex');
console.log('HMAC:', result);

4. 随机数生成(Random Number Generation)

crypto 提供了生成安全随机数的功能,用于生成随机密码、令牌等。

  • randomBytes(size):生成指定字节数的随机数据。

示例:生成随机字节

const randomBytes = crypto.randomBytes(16);  // 生成16个随机字节
console.log(randomBytes.toString('hex'));   // 输出十六进制字符串

5. 数字签名(Digital Signature)

数字签名用于验证数据的完整性和身份认证,通常用于公钥基础设施(PKI)中。它使用私钥对数据签名,使用公钥验证签名。

  • createSign(algorithm):创建一个签名对象,algorithm指定哈希算法。
  • createVerify(algorithm):创建一个验证签名对象,algorithm指定哈希算法。
  • sign(privateKey, encoding):使用私钥对数据进行签名。
  • verify(publicKey, signature, encoding):使用公钥验证签名。

示例:生成签名

const { privateKey, publicKey } = crypto.generateKeyPairSync('rsa', {
  modulusLength: 2048,
});
// 生成签名
const sign = crypto.createSign('SHA256');
sign.update('Hello, world!');
const signature = sign.sign(privateKey, 'hex');
console.log('Signature:', signature);
// 验证签名
const verify = crypto.createVerify('SHA256');
verify.update('Hello, world!');
const isVerified = verify.verify(publicKey, signature, 'hex');
console.log('Verified:', isVerified);  // true 或 false

6. 密钥对生成(Key Pair Generation)

非对称加密中,公钥和私钥的生成可以通过 crypto.generateKeyPairSync 方法。

  • generateKeyPairSync(type, options):生成公钥和私钥对,type指定加密算法类型(如'rsa'),options包含密钥的相关参数。
  • export(options):将密钥导出为 PEM 格式。

示例:生成 RSA 密钥对

const { privateKey, publicKey } = crypto.generateKeyPairSync('rsa', {
  modulusLength: 2048,
});
console.log('Private Key:', privateKey.export({ type: 'pkcs1', format: 'pem' }));
console.log('Public Key:', publicKey.export({ type: 'pkcs1', format: 'pem' }));

到此这篇关于node.js内置模块之crypto 模块及作用详解的文章就介绍到这了,更多相关node.js内置模块crypto内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • node.js中的fs.fchmod方法使用说明

    node.js中的fs.fchmod方法使用说明

    这篇文章主要介绍了node.js中的fs.fchmod方法使用说明,本文介绍了fs.fchmod的方法说明、语法、接收参数、使用实例和实现源码,需要的朋友可以参考下
    2014-12-12
  • Node.js读取Excel文件并处理合并单元格

    Node.js读取Excel文件并处理合并单元格

    在现代的数据处理任务中,Excel 文件是一种非常常见的数据存储格式,本文将介绍如何使用 Node.js 读取 Excel 文件,并处理其中的合并单元格,需要的可以参考下
    2025-03-03
  • node.js中的fs.chmod方法使用说明

    node.js中的fs.chmod方法使用说明

    这篇文章主要介绍了node.js中的fs.chmod方法使用说明,本文介绍了fs.chmod方法说明、语法、接收参数、使用实例和实现源码,需要的朋友可以参考下
    2014-12-12
  • package.json配置文件构成详解

    package.json配置文件构成详解

    这篇文章主要介绍了package.json配置文件构成以及相关知识点内容,有兴趣的朋友们可以学习下。
    2019-08-08
  • 如何在node的express中使用socket.io

    如何在node的express中使用socket.io

    这篇文章主要介绍了如何在node的express中使用socket.io,需要的朋友可以参考下
    2014-12-12
  • nodejs的路径问题的解决

    nodejs的路径问题的解决

    这篇文章主要介绍了nodejs的路径问题的解决,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-06-06
  • node+express制作爬虫教程

    node+express制作爬虫教程

    这篇文章主要介绍了node+express制作爬虫的详细过程和相关基础知识,非常的不错,需要的朋友可以参考下
    2016-11-11
  • node.js中的favicon.ico请求问题处理

    node.js中的favicon.ico请求问题处理

    本文记录了在项目中使用node.js请求favican.ico的时候会出现2条请求,浪费资源,经过一番改进,记录下来过程,以后注意。
    2014-12-12
  • 关于npm主版本升级及其相关知识点总结

    关于npm主版本升级及其相关知识点总结

    npm是Node.js默认的包管理器,以javascript 编写的软件包管理系统用于分享和使用代码,下面这篇文章主要给大家介绍了关于npm主版本升级及其相关知识点总结的相关资料,需要的朋友可以参考下
    2022-12-12
  • Node.js EventEmmitter事件监听器用法实例分析

    Node.js EventEmmitter事件监听器用法实例分析

    这篇文章主要介绍了Node.js EventEmmitter事件监听器用法,结合实例形式分析了EventEmmitter事件监听器相关函数与使用技巧,需要的朋友可以参考下
    2019-01-01

最新评论