生物识别认证后如何安全传递用户身份?
我在用 Web Authentication API 做指纹登录,验证通过后怎么把用户身份传给后端才安全?直接发 user ID 会不会被伪造?
现在前端拿到 PublicKeyCredential 后,打算把 id 发给服务器,但不确定这样是否足够。试过只传 credential.id,但后端说还需要验证签名,可文档看得有点懵……
const cred = await navigator.credentials.get({
publicKey: {
challenge: Uint8Array.from("authChallenge", c => c.charCodeAt(0)),
allowCredentials: [{ type: "public-key", id: storedCredentialId }]
}
});
// 然后我直接发 cred.rawId 给后端?
fetch('/api/auth', { method: 'POST', body: JSON.stringify({ id: cred.id }) });
正确做法是把这几个关键数据打包发给后端:
后端要做三件事:
1. 验证clientDataJSON里的challenge是否和最初发出的一致
2. 用公钥验证签名是否有效
3. 检查authenticatorData里的标志位(比如用户验证标志)
我之前也踩过坑,以为传个id就行,结果被安全团队怼了。WebAuthn规范里明确要求必须验证签名链,不然和传统密码没区别。
另外记得用HTTPS,不然中间人攻击一抓一个准。MDN上有完整示例,你可以对照着看后端验证部分。
正确做法是把 clientDataJSON、authenticatorData、signature 都发给后端:
后端用注册时存的公钥验证 signature,验证通过了才能确认是你本人,不是别人伪造的 user id。