菜单

加密系统

相关源文件

Node.js 加密系统提供加密功能,包括一系列 OpenSSL 的哈希、HMAC、加密、解密、签名和验证函数的封装。它使 Node.js 应用程序能够进行安全的数据处理、加密/解密、数字签名、证书管理和其他加密操作。本页介绍了加密系统的架构、组件和核心功能。

有关 HTTP 特定的安全功能,请参阅 HTTP 系统

架构概述

Node.js 加密系统结构分为三个主要层次

  1. JavaScript API 层:通过 node:crypto 模块向 Node.js 开发人员公开的公共接口。
  2. C++ 实现层:实现加密功能并与 OpenSSL 接口的本地代码绑定。
  3. OpenSSL 库:执行实际加密操作的底层加密库。

来源

核心组件

Node.js 加密系统包含几个提供各种加密功能的组件

来源

证书管理

Certificate 类提供了处理 SPKAC(签名公钥和挑战)数据的方法,该数据在历史上用于 HTML5 的 keygen 元素(现已弃用)。

主要功能

  • 从 SPKAC 数据导出公钥
  • 验证 SPKAC 数据
  • 处理挑战组件

来源

加密与解密

这些组件处理对称加密和解密操作。它们通过 OpenSSL 支持各种加密算法、模式和选项。

加密和解密可在两种模式下运行

  1. 流模式:数据写入并加密/解密数据读出
  2. 更新/最终模式:通过调用 update()final() 方法生成加密/解密的数据

主要功能

  • 支持已认证的加密模式(GCM、CCM、OCB、chacha20-poly1305)
  • 处理初始化向量 (IV)
  • 认证标签
  • 其他已认证数据 (AAD)
  • 填充控制

来源

Diffie-Hellman 和 ECDH 密钥交换

这些组件实现了密钥交换协议,允许双方在不安全的通道上安全地建立共享密钥

  1. DiffieHellman:使用离散对数的传统 Diffie-Hellman 密钥交换
  2. ECDH:椭圆曲线 Diffie-Hellman 密钥交换

主要功能

  • 生成密钥对
  • 计算共享密钥
  • 导出/导入公钥和私钥

来源

哈希函数

Hash 组件提供密码哈希函数,将任意大小的数据映射到固定大小的值。

特性

  • 支持多种哈希算法(SHA-1、SHA-256、SHA-512、MD5 等)
  • 用于处理大数据的数据流接口
  • 各种格式的输出(十六进制、base64、缓冲区)

来源

HMAC(基于哈希的消息认证码)

HMAC 通过使用共享密钥与加密哈希函数结合,提供了一种验证消息的数据完整性和身份验证的方法。

特性

  • 支持各种哈希算法
  • 流式接口
  • 各种格式的输出

来源

公钥加密(签名/验证)

这些组件处理使用公钥加密的数字签名

  1. Sign:创建和管理签名操作
  2. Verify:验证签名与数据和公钥的匹配

支持的算法

  • RSA
  • ECDSA
  • ED25519/ED448
  • 其他 OpenSSL 支持的签名算法

来源

密钥管理

加密系统通过 KeyObject 类提供了全面的密钥管理能力

  1. 关键类型:

    • 对称密钥(用于对称加密)
    • 公钥(用于非对称加密)
    • 私钥(用于非对称加密)
  2. 密钥格式:

    • PEM
    • DER
    • JWK (JSON Web Key)
    • PKCS#8
    • PKCS#1
    • SEC1
  3. 关键操作:

    • 生成
    • 导入/导出
    • 格式转换
    • 安全存储和处理

来源

数据流和处理

加密系统在数据流和处理方面遵循一致的模式,涵盖各种加密操作

数据流的关键方面

  1. 输入处理:

    • 接受各种格式的输入(字符串、Buffer、TypedArray、DataView)
    • 将输入转换为适当的内部格式
  2. 处理方式:

    • 初始化 OpenSSL 结构
    • 通过适当的 OpenSSL 函数处理数据
    • 处理错误和异常
  3. 输出格式化:

    • 将 OpenSSL 输出转换为 JavaScript 友好的格式
    • 支持不同的编码选项(十六进制、base64 等)

来源

安全特性

Node.js 加密系统实现了多项安全特性和最佳实践

  1. FIPS 合规性:

    • 可选的 FIPS(联邦信息处理标准)模式
    • 通过运行时选项进行控制
  2. 安全内存处理:

    • 用于敏感加密材料的安全堆
    • 敏感数据清理
  3. 强默认设置:

    • 安全的默认密码套件
    • 现代加密算法
  4. 错误处理:

    • 详细的错误报告
    • 防止时序攻击

来源

性能考量

加密系统在性能方面进行了设计

  1. 异步 API:

    • 加密操作可能是 CPU 密集型的
    • 大多数操作提供同步和异步版本
  2. 流式接口:

    • 分块处理大数据
    • 最大限度地减少内存使用
  3. 内存管理:

    • 高效处理加密上下文
    • 正确的资源清理

来源

常见用例和示例

对称加密

哈希

数字签名

来源

与其他 Node.js 系统集成

Crypto 系统与 Node.js 的其他子系统集成

与流(Streams)集成

Cipher、Decipher、Hash 和 HMAC 等 Crypto 类继承了 Stream.Transform 类,允许它们在 Node.js 流管道中使用

来源

与 TLS/SSL 集成

Crypto 系统为 Node.js 中的 TLS/SSL 实现提供了基础

来源

错误处理

Crypto 系统提供全面的错误处理,包括详细的错误代码和消息

  1. OpenSSL 错误堆栈:

    • 捕获并翻译 OpenSSL 错误代码和消息
    • 为加密错误提供额外上下文
  2. X509 证书错误代码:

    • 证书验证问题的特定错误代码
    • 证书问题的详细错误消息
  3. 特定于操作的错误:

    • Cipher 初始化失败
    • 密钥格式错误
    • 参数验证错误

来源

构建和配置选项

Crypto 系统可以通过各种构建和运行时选项进行配置

  1. 构建选项:

    • 启用或禁用 OpenSSL 支持进行构建
    • 启用 FIPS
  2. 运行时选项:

    • 启用 FIPS 模式
    • OpenSSL 配置文件
    • 密码套件选择
    • 安全级别设置
  3. 环境检测:

    • 检测 Crypto 支持的可用性
    • 在 Crypto 不可用时进行优雅处理

来源

安全考量

在使用 Crypto 系统时,应牢记一些安全注意事项

  1. 算法选择:

    • 使用现代、安全的算法
    • 避免使用已弃用的算法(MD5、RC4、DES)
    • 遵循当前密钥大小的最佳实践
  2. 安全密钥管理:

    • 保护私钥和对称密钥
    • 使用安全的随机数生成
    • 实施适当的密钥轮换
  3. 防止侧信道攻击:

    • 注意时序攻击
    • 对敏感操作使用恒定时间实现
  4. 错误处理:

    • 不要直接向用户暴露加密错误
    • 妥善处理和记录错误
  5. 保持更新:

    • 及时了解 Node.js 和 OpenSSL 的更新
    • 遵循安全公告

来源

性能考量

加密操作可能非常消耗 CPU。请考虑以下性能方面

  1. 异步操作:

    • 对繁重的加密任务使用异步版本
    • 在适当的时候将任务卸载到线程池
  2. 密钥选择:

    • 平衡安全性和性能
    • 更大的密钥提供更高的安全性,但速度较慢
  3. 算法选择:

    • 某些算法比其他算法更快
    • 某些算法可能支持硬件加速
  4. 内存使用:

    • 对于大型加密操作,请监控内存使用情况
    • 对大数据使用流式接口

来源