Node.js 官方 node:crypto 实用教程

本教程讲的是 Node.js 官方文档中的 node:crypto 模块,不是 npm 上名称相似的第三方包,也不是只讲抽象密码学概念。

node:crypto 是 Node.js 内置的密码学模块。它不是“把字符串变乱码”的工具箱,而是一组解决不同安全问题的基础能力:

本教程面向 Node.js 与 TypeScript 初学者,重点是知道“现在遇到的是什么安全问题,应选择哪类工具”,而不是推导 AES、SHA 等算法内部的数学公式。

学习顺序

  1. 先看懂官方 node:crypto 模块
  2. 建立正确的密码学模型
  3. 随机数、普通哈希与 HMAC
  4. 使用 scrypt 安全保存密码
  5. 使用 AES-256-GCM 对称加密业务数据
  6. 签名、JWT 与生产实践

建议按顺序阅读。第 2~5 章都提供了可以放进当前 TypeScript 项目运行的例子。

一张表先选对工具

实际问题 推荐能力 常用接口 原文能否恢复
生成重置密码 Token 安全随机数 randomBytes() 不适用
生成指定范围整数 无偏随机整数 randomInt() 不适用
检查文件是否改变 普通哈希 createHash()
证明消息来自共享密钥持有者 HMAC createHmac()
保存用户登录密码 慢速密码哈希 scrypt();生产中也常用 Argon2id
保存以后必须取回的密钥或隐私字段 认证加密 createCipheriv() / createDecipheriv()
JWT HS256 签发与验证 HMAC + JWT 规则 实际项目用 jsonwebtoken Payload 本来就可读取
多服务使用私钥签名、公钥验签 非对称签名 sign() / verify() 不适用

最重要的选择题是:

需要以后得到原文吗?
├── 不需要
│   ├── 人类密码:scrypt / Argon2id
│   ├── 数据指纹:SHA-256
│   └── 还要证明来源:HMAC / 数字签名
└── 需要
    └── AES-GCM 等认证加密

与当前项目的关系

node:crypto 是 Node.js 内置模块,不需要执行 npm install crypto。当前项目采用 TypeScript 源码、CommonJS 编译输出和 ts-node 运行方式,可以直接使用命名导入:

import { createHash, randomBytes } from "node:crypto";

const token = randomBytes(32).toString("base64url");
const digest = createHash("sha256").update(token).digest("hex");

console.log({ token, digest });

保存为临时的 .ts 文件后,可以这样运行:

ts-node 文件名.ts

也可以检查整个项目的 TypeScript 类型:

npx tsc --noEmit

本教程的可运行示例以 Node.js 20 及以上版本为目标,与项目中的 @types/node ^20.11.0 对齐。编写本文时,当前终端实际是 Node.js v12.22.1;它早于本项目的类型声明和部分依赖要求。运行示例前应先切换到 Node.js 20+,否则可能出现“类型检查通过但运行时没有该接口”或依赖无法运行的问题。

Node.js 官方最新版文档还可能列出 crypto.argon2()randomUUIDv7() 等更新接口。它们是否能用,取决于实际 Node.js 版本、接口稳定级别以及项目的类型声明,不能因为最新版网页存在就直接在旧项目中调用。

学完应该能回答的问题

如果这些问题都能用自己的话解释,就已经掌握了日常 Node.js 开发中最重要的密码学边界。

主要资料

本文在 2026-08-20 核对了官方页面。官方页面会随 Node.js 最新版本更新,具体接口的版本历史和稳定级别应以页面中的 History Version Changes 与 Stability 标记为准。