@ 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包可用. 然而,在我研究这些提议时,所有提议似乎都没有得到维护,有些领域可以改进(包括安全关键问题).
您的用法大小写可能有所不同(例如, 如果您需要比这个软件包更需要定制), 但这就是我为什么没有使用其他软件包, 决定自己写:
- 爱说话 似乎在教学中是最推荐的软件包。 然而,它不会产生安全的秘密.
- atplib 函数 每周的下载量甚至更多,在他们的秘密世代中没有偏见. 然而,它们产生的秘密太短(除非您指定了长度),甚至没有达到TOTP规格中定义的最小值.
- 节点-2fa 没有明显的安全问题。 然而,仍有一些东西阻止我使用.
generateSecret也返回一个有用的 QR 代码链接 - 即刻向 Google 发送您的秘密 。 你真的应该生成自己的QR代码,而不是向Google发送你的秘密.- 这取决于
notp用于密钥生成notp包含在节点被折旧的代码,例如 .new Buffer(...)这不是一个安全问题,但将对使用其包裹的所有人发出贬值警告。 有一个 公关 从2021年至今尚未合并.
- 这个软件包没有更改日志( 至少我找不到)
- 没有其他软件包使用常时比较来检查代码. 我认为时机攻击不太可能,但使用常时比较功能可以阻止这些攻击.