@chax-at/totp

中文文档
1.0.0发布于 2025/06/17MITTypeScriptCommonJS零依赖构建来源已验证近 30 天下载 3639

一个简单的 TOTP 软件包

中文使用文档
文档目录5 节
  1. 使用量
  2. Totp 管理器
  3. 创建秘密
  4. 正在验证 TOTP 代码
  5. 为什么又一个TOTP包?

@ chax-at/totp (英语)

一个简单的软件包,可以用来执行TOTP 二要素代码. 执行默认使用大小写(6位码,30s分时步,20字节/160位碱基32-被编码后的秘密,使用SHA1),但不提供多少定制.

这些默认值是最常见的,应该在所有验证器应用中支持. 如果你想知道你为什么要用这个包而不是其他包, 请检查区域 为什么又是TOTP软件包 在底层.

使用量

通过运行安装软件包

npm i @chax-at/totp

Totp 管理器

然后,你可以创建一个 TotpManager 生成秘密和验证密码。 您可以创建 TotpManager 像这样:

import { TotpManager } from '@chax-at/totp';

const totpManager = new TotpManager({
  // This issuer will be shown in the user's authenticator app and should be something like your company/service name
  issuer: 'ExampleWebsite',
  // You can also specify `verifyWindow` here. Defaults to 2 which means that the TOTP code at current time is valid as well as the previous 2 and next 2
});

创建秘密

假设用户 [email protected] 想要使用他们的 TOTP 应用程序启用两个因子 。 您现在可以为此用户生成一个秘密 :

// Include the user's account name/email here which is shown in their authenticator app when scanning the QR code
const { secret, otpauthUri } = totpManager.generateSecret('[email protected]');
  • 保存返回的内容 secret 用于数据库中的用户。 建议加密这个秘密(注意您不能散开,因为您需要用简写来验证代码).

我们还建议将钥匙安全地储存在验证系统中, 更具体地说,用防篡改的方法加密它们 硬件加密并仅在需要时披露: 例如,当需要校验检察官办公室值时会解密密钥,以及 立即重新加密,将内存中的曝光限制为短 期限. RFC 6238、5.1

  • 生成包含返回的 QR 代码 otpauthUri 并显示给用户。 然后他们可以用他们的认证程序扫描它.
  • 您也可以显示 secret 这样他们就可以手动注册您的应用程序,以防QR代码失效.
  • 您应该要求用户在实际启用双要素认证之前输入一个有效的代码 .

正在验证 TOTP 代码

假设用户输入代码 123456,然后你可以这样验证:

// Returns whether the code is valid at the current time. Also returns true if it matches the previous/next [verifyWindow] codes as defined above
const isValid = totpManager.verify(secret, '123456');
  • 您应该限制 TOTP 校验, 以便攻击者不能粗暴强制 TOTP 代码( 可能只有 1 000 000 个代码)
  • 您至少应该为每个用户保存( 并拒绝) “ 使用” 的正确符号 30s + 30s * verifyWindow [default 2] 这样,您的一次性密码( TOTP 部分) 只能使用一次

注意证明人可在某一时间段内派出同一检察官办公室 窗口到验证器。 核查者必须不接受 检察官办公室在成功验证后的第二次尝试 为第一个检察官办公室印发,确保一次性只使用 检察官办公室. RFC 6238、5.2

为什么又一个TOTP包?

有一些被广泛使用的节点TOTP/2FA包可用. 然而,在我研究这些提议时,所有提议似乎都没有得到维护,有些领域可以改进(包括安全关键问题).

您的用法大小写可能有所不同(例如, 如果您需要比这个软件包更需要定制), 但这就是我为什么没有使用其他软件包, 决定自己写:

  • 爱说话 似乎在教学中是最推荐的软件包。 然而,它不会产生安全的秘密.
    • sayeasy 忘记了字母"j"的存在,因此它根本不出现在秘密中[来源[ . ]
    • soneeasy在秘密中引入了偏见,防止它完全随机,使攻击变得容易. 有一个 公关 试图修复它 - 但软件包没有维护 .
  • atplib 函数 每周的下载量甚至更多,在他们的秘密世代中没有偏见. 然而,它们产生的秘密太短(除非您指定了长度),甚至没有达到TOTP规格中定义的最小值.
    • RFC 4226表示"共享秘密MUST的长度至少为128位. 这份文件建议共享160比特的秘密长度"
    • 这意味着一个秘密必须至少有16个字节长,并且被推荐为20个字节长(这个@chax-at/top使用)
    • 然而, otplib 更改了默认值( a 20k行更改任务)在12.0.0中,从安全的20字节到仅仅10字节(80比特)[来源[ . ]
      • 升级指南未提及这一点
      • 这个 这个问题 从2022年起,维护者没有回复
    • 关于图书馆的其余部分,我不能多说,因为代码分成了12个套件(而两个文件在@chax-at/totp中各有40/70行),我无法通过点击GitHub中的文件来跟踪所有这些抽象层
  • 节点-2fa 没有明显的安全问题。 然而,仍有一些东西阻止我使用.
    • generateSecret 也返回一个有用的 QR 代码链接 - 即刻向 Google 发送您的秘密 。 你真的应该生成自己的QR代码,而不是向Google发送你的秘密.
    • 这取决于 notp 用于密钥生成
      • notp 包含在节点被折旧的代码,例如 . new Buffer(...)这不是一个安全问题,但将对使用其包裹的所有人发出贬值警告。 有一个 公关 从2021年至今尚未合并.
    • 这个软件包没有更改日志( 至少我找不到)
  • 没有其他软件包使用常时比较来检查代码. 我认为时机攻击不太可能,但使用常时比较功能可以阻止这些攻击.

版本与发布记录

@chax-at/totp 共发布 5 个版本,首次发布于 2024/03/01;过去 12 个月发布了 0 个版本。最新版本附带 npm provenance 构建来源证明,可追溯到公开的 CI 构建记录。

版本发布日期距今
1.0.0latest2025/06/171.4 年前
0.2.12024/03/082 年前
0.2.02024/03/082 年前
0.1.12024/03/032 年前
0.1.02024/03/012 年前

关于 @chax-at/totp 的常见问题

@chax-at/totp 是什么?

一个简单的 TOTP 软件包

如何安装 @chax-at/totp?

在项目目录运行 npm install @chax-at/totp,或使用 pnpm add / yarn add / bun add。

@chax-at/totp 支持 TypeScript 吗?

支持。包内自带 TypeScript 类型声明(package.json 声明了 types 入口),安装后即可获得类型提示,无需再安装 @types 包。

@chax-at/totp 支持 ESM 还是 CommonJS?

以 CommonJS 形式发布,可以直接 require();在 ES Module 项目中也可以用 import 引入(Node.js 会把 module.exports 作为默认导出)。

@chax-at/totp 需要什么版本的 Node.js?

package.json 的 engines 字段要求 Node.js >= 20。版本不符时 npm 默认只给出警告,开启 engine-strict 后会拒绝安装。

@chax-at/totp 可以商用吗?

@chax-at/totp 使用 MIT 许可。宽松许可:允许商业使用、修改和再分发,通常只需在分发时保留原版权与许可声明。以上为概括,不构成法律意见,请以许可原文为准。

@chax-at/totp 的下载量有多少?

根据 npm 官方下载统计,@chax-at/totp 在 2026/10/10 – 2026/11/08 这 30 天内被下载 3,639 次,日均约 121 次。下载量会把 CI 构建、镜像同步和作为其他包依赖的安装一并计入,适合横向比较热度,不能直接等同于使用人数。

@chax-at/totp 还在维护吗?

最新版本 1.0.0 发布于 2025/06/17(1.4 年前);至今共发布 5 个版本,其中过去 12 个月发布了 0 个;首次发布于 2024/03/01。发布频率只是参考信号:功能稳定的工具可能很少需要更新,建议结合源码仓库的 issue 和提交记录判断。