我正在学习网络密钥的实现。我主要使用 simplewebauthn 因为它们是 FIDO 兼容包之一。我一直在使用 MacOS 和 ICloud 保存的密钥,大多数事情似乎都按预期工作,但是我第二次使用密钥时会遇到此错误:
Error: Response counter value 0 was lower than expected 1
if (
(counter > 0 || authenticator.counter > 0) &&
counter <= authenticator.counter
) {
// Error out when the counter in the DB is greater than or equal to the counter in the
// dataStruct. It's related to how the authenticator maintains the number of times its been
// used for this client. If this happens, then someone's somehow increased the counter
// on the device without going through this site
throw new Error(
`Response counter value ${counter} was lower than expected ${authenticator.counter}`,
);
}
看起来 simplewebauthn 提到 MacOS 多设备密钥可能永远不会增加计数器:https://simplewebauthn.dev/docs/packages/server#3-post-registration- Responsible
“对于某些高配置的身份验证器(例如 macOS 上的 Touch ID),签名计数器始终返回 0(零)也不足为奇。在这种情况下,RP 无法真正执行任何操作来检测克隆的身份验证器,尤其是在多设备凭证的上下文。”
我确实有一段代码,每次在 MacOS 上进行身份验证时都会递增密钥计数器,但我想知道:这就是事实吗?由于 MacOS ICloud 保存的密钥永远不会增加,我是否应该不去增加网站上的计数器?我没有找到使用 simplewebauthn 构建 MacOS 特定处理的方法,因此我可以跳过增量,直到将来实现计数器或更新其他内容为止。
一年多前,针对 Apple 应用程序开发提出了同样的问题,建议 passkeys.com 也使用了 simplewebauthn,但从未解决计数器问题。 集成密钥signCount 0
我尝试过不增加数据库中的密码,这似乎是最简单、最流畅的身份验证方法,但是如果有人设法复制密钥,它就会很容易受到攻击。
我假设出于所有目的,中期解决方案是不在我的数据库中增加这些密钥,但我想知道是否有人有更多关于为什么多设备密钥不增加以及其他人有什么解决方法的信息一直在使用。有人可能复制这些密钥之一,这有多危险?
它几乎在 WebAuthn 规范中进行了阐述。
您不应该增加您这边的计数器。您只需存储从身份验证器收到的 signCount
值,并在下次身份验证时将新的
signCount
值与存储的值进行比较。然后:
如果其中一个不为零,则新的 值为 小于或等于存储值,克隆认证器可以 存在,或者验证器可能出现故障。