webauthn - WebAuthn 身份验证器证明响应 id 和 rawId
问题描述
我想问一个关于id
和的问题rawId
。
在实施 webauthn 时,在身份验证器证明响应中,我看到我们同时拥有id
和rawId
. 阅读规范(https://www.w3.org/TR/webauthn-1/#dom-publickeycredential-rawid),id
是base64url(rawId)
{
"type": "public-key",
"id": "AV1--2gCLXLF9_5bGWDwZn6FP_OqAWfKY74mckatWMgN65o5OW8q2k9XVbYl8kAqPtpEoBlM0opKEjwDqYRBDIYbAl058O8ZQWS-r0M0L-9ikcu3tKuMxfFnRZ9gU6tnDH6QqzYwUg",
"rawId": "AV1--2gCLXLF9_5bGWDwZn6FP_OqAWfKY74mckatWMgN65o5OW8q2k9XVbYl8kAqPtpEoBlM0opKEjwDqYRBDIYbAl058O8ZQWS-r0M0L-9ikcu3tKuMxfFnRZ9gU6tnDH6QqzYwUg",
"response": {
...
}
...
}
所以这是我的问题:
- 为什么我们需要
id
- 为什么在上面的例子中,我
id
的完全一样rawId
?- 它总是一样吗?
id
如果是这样,我们可以在响应中摆脱吗?
- 它总是一样吗?
- 如果我将公钥保存
id
到数据库(稍后使用该公钥id
创建allowCredentials
列表),我应该遵循以下哪一个?- 保存
id
在数据库中,用于id
创建allowCredentials列表 - 保存
base64url(rawId)
在数据库中,然后使用该 base64 url 编码值创建allowCredentials
列表
- 保存
解决方案
Q1。为什么我们需要 id
为什么我们同时拥有 id 和 rawId的答案是因为它是规范中的设计:
id 是从 Credential 继承的,尽管 PublicKeyCredential 会覆盖 Credential 的 getter,而是返回对象标识符内部插槽中包含的数据的 base64url 编码。
https://www.w3.org/TR/webauthn-2/#iface-pkcredential
Q2。为什么在上面的例子中,我的 id 和 rawId 完全一样?它总是一样吗?如果是这样,我们可以摆脱响应中的 id 吗?
我们返回 rawId 的原始字节,作为注册响应初始验证的一部分,必须将其与 id 中编码的字节进行比较,因此从技术上讲,我们不能放弃它。
此外,无论出于何种原因,如果 base64url 编码不合适,RP 可能会使用未编码的原始值,因此也会返回 rawId。
Q3。如果我将公钥 ID 保存到数据库中(稍后使用该公钥 ID 创建allowCredentials
列表),我应该遵循以下哪一个?
如上所述,这取决于 RP 实现,无论出于何种原因,如果 base64url 编码不合适,RP 可能会使用未编码的原始值并将其编码为 RP 喜欢的任何格式。
我存储 id 是因为它已经被编码成一种格式,便于在故障排除时在日志中复制/粘贴和比较。稍后我们将使用该 id 创建allowCredentials
并将其发送回身份验证器。不需要做额外的工作base64url(rawId)
,使用id
就完全没问题了。
推荐阅读
- xslt - 基于逻辑将不同元素复制到变量中 - XSLT
- docker - 单个 Docker 映像
- fancytree - 当在花式树中延迟加载时,如何将 a 添加到子节点?
我这周刚开始使用fancytree,我想在节点延迟加载时添加一个表,该表的数据将是GET请求的输出,我有代码来生成我想要的表使用 jquery,但是当需要将其添加到 data.result 时,我不知道该怎么做,它需要一个子列表,并且我的函数的输出将是代码段中的表
我尝试了很多而且很可能是愚蠢的事情,但在示例中找不到任何帮助,请帮助!
- azure - arm 模板 PowerShell 自定义脚本
- automationanywhere - 在 Automation Anywhere 中关闭虚拟机时,如何使对象克隆和管理 Windows 控件正常工作?
- wso2 - How to create a WSO2 ESB Composite Application through the Integration Cloud API?
- android - 重新初始化 livedata 对象
- docker - Docker 容器内的 Roundcube 和 Dovecot
- android - 我们可以更漂亮地向 Fragments 传递参数吗?
- python - numpy:在排序数组中查找索引(以一种有效的方式)