加密系统
相关源文件
Node.js 加密系统提供加密功能,包括一系列 OpenSSL 的哈希、HMAC、加密、解密、签名和验证函数的封装。它使 Node.js 应用程序能够进行安全的数据处理、加密/解密、数字签名、证书管理和其他加密操作。本页介绍了加密系统的架构、组件和核心功能。
有关 HTTP 特定的安全功能,请参阅 HTTP 系统。
架构概述
Node.js 加密系统结构分为三个主要层次
- JavaScript API 层:通过
node:crypto 模块向 Node.js 开发人员公开的公共接口。
- C++ 实现层:实现加密功能并与 OpenSSL 接口的本地代码绑定。
- OpenSSL 库:执行实际加密操作的底层加密库。
来源
核心组件
Node.js 加密系统包含几个提供各种加密功能的组件
来源
证书管理
Certificate 类提供了处理 SPKAC(签名公钥和挑战)数据的方法,该数据在历史上用于 HTML5 的 keygen 元素(现已弃用)。
主要功能
- 从 SPKAC 数据导出公钥
- 验证 SPKAC 数据
- 处理挑战组件
来源
加密与解密
这些组件处理对称加密和解密操作。它们通过 OpenSSL 支持各种加密算法、模式和选项。
加密和解密可在两种模式下运行
- 流模式:数据写入并加密/解密数据读出
- 更新/最终模式:通过调用
update() 和 final() 方法生成加密/解密的数据
主要功能
- 支持已认证的加密模式(GCM、CCM、OCB、chacha20-poly1305)
- 处理初始化向量 (IV)
- 认证标签
- 其他已认证数据 (AAD)
- 填充控制
来源
Diffie-Hellman 和 ECDH 密钥交换
这些组件实现了密钥交换协议,允许双方在不安全的通道上安全地建立共享密钥
- DiffieHellman:使用离散对数的传统 Diffie-Hellman 密钥交换
- ECDH:椭圆曲线 Diffie-Hellman 密钥交换
主要功能
来源
哈希函数
Hash 组件提供密码哈希函数,将任意大小的数据映射到固定大小的值。
特性
- 支持多种哈希算法(SHA-1、SHA-256、SHA-512、MD5 等)
- 用于处理大数据的数据流接口
- 各种格式的输出(十六进制、base64、缓冲区)
来源
HMAC(基于哈希的消息认证码)
HMAC 通过使用共享密钥与加密哈希函数结合,提供了一种验证消息的数据完整性和身份验证的方法。
特性
来源
公钥加密(签名/验证)
这些组件处理使用公钥加密的数字签名
- Sign:创建和管理签名操作
- Verify:验证签名与数据和公钥的匹配
支持的算法
- RSA
- ECDSA
- ED25519/ED448
- 其他 OpenSSL 支持的签名算法
来源
密钥管理
加密系统通过 KeyObject 类提供了全面的密钥管理能力
-
关键类型:
- 对称密钥(用于对称加密)
- 公钥(用于非对称加密)
- 私钥(用于非对称加密)
-
密钥格式:
- PEM
- DER
- JWK (JSON Web Key)
- PKCS#8
- PKCS#1
- SEC1
-
关键操作:
来源
数据流和处理
加密系统在数据流和处理方面遵循一致的模式,涵盖各种加密操作
数据流的关键方面
-
输入处理:
- 接受各种格式的输入(字符串、Buffer、TypedArray、DataView)
- 将输入转换为适当的内部格式
-
处理方式:
- 初始化 OpenSSL 结构
- 通过适当的 OpenSSL 函数处理数据
- 处理错误和异常
-
输出格式化:
- 将 OpenSSL 输出转换为 JavaScript 友好的格式
- 支持不同的编码选项(十六进制、base64 等)
来源
安全特性
Node.js 加密系统实现了多项安全特性和最佳实践
-
FIPS 合规性:
- 可选的 FIPS(联邦信息处理标准)模式
- 通过运行时选项进行控制
-
安全内存处理:
-
强默认设置:
-
错误处理:
来源
加密系统在性能方面进行了设计
-
异步 API:
- 加密操作可能是 CPU 密集型的
- 大多数操作提供同步和异步版本
-
流式接口:
-
内存管理:
来源
常见用例和示例
对称加密
哈希
数字签名
来源
与其他 Node.js 系统集成
Crypto 系统与 Node.js 的其他子系统集成
与流(Streams)集成
Cipher、Decipher、Hash 和 HMAC 等 Crypto 类继承了 Stream.Transform 类,允许它们在 Node.js 流管道中使用
来源
与 TLS/SSL 集成
Crypto 系统为 Node.js 中的 TLS/SSL 实现提供了基础
来源
错误处理
Crypto 系统提供全面的错误处理,包括详细的错误代码和消息
-
OpenSSL 错误堆栈:
- 捕获并翻译 OpenSSL 错误代码和消息
- 为加密错误提供额外上下文
-
X509 证书错误代码:
- 证书验证问题的特定错误代码
- 证书问题的详细错误消息
-
特定于操作的错误:
- Cipher 初始化失败
- 密钥格式错误
- 参数验证错误
来源
构建和配置选项
Crypto 系统可以通过各种构建和运行时选项进行配置
-
构建选项:
- 启用或禁用 OpenSSL 支持进行构建
- 启用 FIPS
-
运行时选项:
- 启用 FIPS 模式
- OpenSSL 配置文件
- 密码套件选择
- 安全级别设置
-
环境检测:
- 检测 Crypto 支持的可用性
- 在 Crypto 不可用时进行优雅处理
来源
安全考量
在使用 Crypto 系统时,应牢记一些安全注意事项
-
算法选择:
- 使用现代、安全的算法
- 避免使用已弃用的算法(MD5、RC4、DES)
- 遵循当前密钥大小的最佳实践
-
安全密钥管理:
- 保护私钥和对称密钥
- 使用安全的随机数生成
- 实施适当的密钥轮换
-
防止侧信道攻击:
-
错误处理:
-
保持更新:
- 及时了解 Node.js 和 OpenSSL 的更新
- 遵循安全公告
来源
加密操作可能非常消耗 CPU。请考虑以下性能方面
-
异步操作:
- 对繁重的加密任务使用异步版本
- 在适当的时候将任务卸载到线程池
-
密钥选择:
- 平衡安全性和性能
- 更大的密钥提供更高的安全性,但速度较慢
-
算法选择:
-
内存使用:
- 对于大型加密操作,请监控内存使用情况
- 对大数据使用流式接口
来源