Web身份验证(WebAuthn)(下)

本文涉及的产品
可视分析地图(DataV-Atlas),3 个项目,100M 存储空间
云解析 DNS,旗舰版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介: Web身份验证(WebAuthn)(下)

解析attestationObject:

1. // note: a CBOR decoder library is needed here.
2. const decodedAttestationObj = CBOR.decode(
3.     credential.response.attestationObject);
4. 
5. console.log(decodedAttestationObject);
6. {
7. // 这里的authenticator数据是一个字节数组,包含有关注册事件的元数据,
8. // 以及我们将用于未来身份验证的公钥。
9. authData: Uint8Array(196),
10. fmt: "fido-u2f",  // 表示证明格式
11. attStmt: {
12. sig: Uint8Array(70),  // 签名
13. x5c: Array(1),        // X.509 格式编码的证明证书。
14. alg: -7 // -7 使用SHA-256对应的哈希算法的摘要
15.     },
16. }

解析验证器数据:

1. const {authData} = decodedAttestationObject;
2. 
3. // get the length of the credential ID
4. const dataView = new DataView(
5. new ArrayBuffer(2));
6. const idLenBytes = authData.slice(53, 55);
7. idLenBytes.forEach(
8. (value, index) => dataView.setUint8(
9.         index, value));
10. const credentialIdLength = dataView.getUint16();
11. 
12. // get the credential ID
13. const credentialId = authData.slice(
14. 55, 55 + credentialIdLength);
15. 
16. // get the public key object
17. const publicKeyBytes = authData.slice(
18. 55 + credentialIdLength);
19. 
20. // the publicKeyBytes are encoded again as CBOR
21. const publicKeyObject = CBOR.decode(
22.     publicKeyBytes.buffer);
23. console.log(publicKeyObject)
24. 
25. {
26. 1: 2,
27. 3: -7,
28.     -1: 1,
29.     -2: Uint8Array(32) ...
30.     -3: Uint8Array(32) ...
31. }

authData是规范中描述的字节数组。解析它将涉及从数组中切片字节并将它们转换为可用的对象。

最后检索到的publicKeyObject是一个以COSE标准编码的对象,这是一种描述凭证公钥和使用它所需的元数据的简洁方式。

1: 1字段描述密钥类型。值2表示关键点类型为椭圆曲线格式。

3: 3字段描述用于生成身份验证签名的算法。-7值指示此身份验证器将使用ES256。

-1: -1字段描述此键的“曲线类型”。值1指示该键使用“P-256”曲线。

-2: -2字段描述此公钥的x坐标。

-3: -3字段描述此公钥的y坐标。

5.2使用WebAuthn凭据进行身份验证

注册完成后,现在可以对用户进行身份验证。在认证期间,创建断言,这是用户拥有私钥的证明。此断言包含使用私钥创建的签名。服务器使用在注册期间检索到的公钥来验证此签名。

navigator.credentials.get()

在身份验证过程中,用户证明他们拥有他们注册的私钥。 它们通过提供一个assertion来实现,是在客户端上调用navigator.credentials.get()生成的。这将检索在注册期间生成的包含签名的凭证。

1. const credential = await navigator.credentials.get({
2. publicKey: publicKeyCredentialRequestOptions
3. });

publicKeyCredentialCreationOptions对象包含许多必需和可选字段,服务器指定这些字段为用户创建新凭证。

1. const publicKeyCredentialRequestOptions = {
2. challenge: Uint8Array.from(
3.         randomStringFromServer, c => c.charCodeAt(0)),
4. // 这个数组告诉浏览器服务器希望用户使用哪些凭据进行身份验证。
5. allowCredentials: [{
6. id: Uint8Array.from(
7.             credentialId, c => c.charCodeAt(0)),
8. type: 'public-key',
9. transports: ['usb', 'ble', 'nfc'], // 传输方式 USB、蓝牙,NFC
10.     }],
11. timeout: 60000,
12. }
13. 
14. const assertion = await navigator.credentials.get({
15. publicKey: publicKeyCredentialRequestOptions
16. });

从assertion调用返回的get()对象再次是PublicKeyCredential对象。它与我们在注册时收到的对象略有不同;特别是它包括signature成员,并且不包括公钥。

 

1. console.log(assertion);
2. 
3. PublicKeyCredential {
4. id: 'ADSUllKQmbqdGtpu4sjseh4cg2TxSvrbcHDTBsv4NSSX9...',
5. rawId: ArrayBuffer(59),
6. response: AuthenticatorAssertionResponse {
7. // 认证器数据类似于注册期间接收的authData,但值得注意的是,这里不包括公钥。
8. authenticatorData: ArrayBuffer(191),  
9. clientDataJSON: ArrayBuffer(118), // 用作签名的一些数据
10. signature: ArrayBuffer(70), // 私钥签名
11. userHandle: ArrayBuffer(10),
12.     },
13. type: 'public-key'
14. }

解析和验证身份验证数据:

获得认证后,将其发送到服务器进行验证。在验证数据完全有效之后,使用在注册期间存储在数据库中的公钥来验证签名。

1. const storedCredential = await getCredentialFromDatabase(
2.     userHandle, credentialId);
3. 
4. const signedData = (
5.     authenticatorDataBytes +
6.     hashedClientDataJSON);
7. 
8. const signatureIsValid = storedCredential.publicKey.verify(
9.     signature, signedData);
10. 
11. if (signatureIsValid) {
12. return "签名校验成功! 🎉";
13. } else {
14. return "签名校验失败. 😭"
15. }

6、 WebAuthn演示(注册和认证)

有关WebAuthn的演示,请访问

6.1 注册演示:

用Chrome 浏览器进行测试,第一步:输入用户名(zj),单击“Register” 按钮。用电脑测试,需打开蓝牙。

然后输入电脑密码,则提示验证成功!

6.2 认证演示:

1、输入用户名,点击“”按钮,进行认证,登录成功,如下所示:

6.3 浏览器中存储

在Chrome浏览器中,点击“设置”->“自动填充”->“密码管理”可以找到对应的通用密钥,如下图所示:


相关实践学习
DataV Board用户界面概览
本实验带领用户熟悉DataV Board这款可视化产品的用户界面
阿里云实时数仓实战 - 项目介绍及架构设计
课程简介 1)学习搭建一个数据仓库的过程,理解数据在整个数仓架构的从采集、存储、计算、输出、展示的整个业务流程。 2)整个数仓体系完全搭建在阿里云架构上,理解并学会运用各个服务组件,了解各个组件之间如何配合联动。 3 )前置知识要求   课程大纲 第一章 了解数据仓库概念 初步了解数据仓库是干什么的 第二章 按照企业开发的标准去搭建一个数据仓库 数据仓库的需求是什么 架构 怎么选型怎么购买服务器 第三章 数据生成模块 用户形成数据的一个准备 按照企业的标准,准备了十一张用户行为表 方便使用 第四章 采集模块的搭建 购买阿里云服务器 安装 JDK 安装 Flume 第五章 用户行为数据仓库 严格按照企业的标准开发 第六章 搭建业务数仓理论基础和对表的分类同步 第七章 业务数仓的搭建  业务行为数仓效果图  
相关文章
|
20天前
|
存储 JSON 安全
如何使用 JSON Web Tokens 进行身份验证?
总的来说,JWT 是一种强大而灵活的身份验证方式,通过正确使用和管理,可以为应用提供可靠的身份验证机制,同时提高系统的可扩展性和安全性。在实际应用中,需要根据具体的需求和场景,合理设计和实施 JWT 身份验证方案。
39 8
|
4月前
|
存储 JSON 数据安全/隐私保护
"FastAPI身份验证与授权的奥秘:如何用Python打造坚不可摧的Web应用,让你的项目一鸣惊人?"
【8月更文挑战第31天】在现代Web开发中,保证应用安全性至关重要,FastAPI作为高性能Python框架,提供了多种身份验证与授权方式,包括HTTP基础认证、OAuth2及JWT。本文将对比这些机制并附上示例代码,展示如何使用HTTP基础认证、OAuth2协议以及JWT进行用户身份验证,确保只有合法用户才能访问受保护资源。通过具体示例,读者可以了解如何在FastAPI项目中实施这些安全措施。
157 1
|
4月前
|
JavaScript 安全 前端开发
Node.js身份验证全攻略:策略与实践,打造坚不可摧的Web应用安全防线!
【8月更文挑战第22天】Node.js作为强大的服务器端JavaScript平台,对于构建高效网络应用至关重要。本文探讨其身份验证策略,涵盖从基于token至复杂的OAuth 2.0及JWT。Passport.js作为认证中间件,支持本地账号验证及第三方服务如Google、Facebook登录。同时介绍JWT轻量级验证机制,确保数据安全传输。开发者可根据应用需求选择合适方案,注重安全性以保护用户数据。
86 1
|
4月前
|
开发框架 JSON .NET
ASP.NET Core 标识(Identity)框架系列(三):在 ASP.NET Core Web API 项目中使用标识(Identity)框架进行身份验证
ASP.NET Core 标识(Identity)框架系列(三):在 ASP.NET Core Web API 项目中使用标识(Identity)框架进行身份验证
|
4月前
|
存储 安全 测试技术
Web2py中的身份验证与授权之谜:如何让你的Web应用飞起来?
【8月更文挑战第31天】在Web开发中,确保应用安全性至关重要,Web2py作为Python Web框架,提供了强大的身份验证与授权功能。本文探讨了Web2py的身份验证(包括表单验证、密码加密及会话管理)与授权(涵盖角色权限、URL过滤及用户组管理)。通过示例代码展示了用户模型定义、角色关系设置及登录流程处理等关键步骤。合理利用这些功能并结合最佳实践如使用内置验证、灵活控制访问权限及编写测试,可帮助开发者高效构建安全稳定的应用程序。
25 0
|
7月前
|
JSON 安全 API
【专栏】四种REST API身份验证方法:基本认证、OAuth、JSON Web Token(JWT)和API密钥
【4月更文挑战第28天】本文探讨了四种REST API身份验证方法:基本认证、OAuth、JSON Web Token(JWT)和API密钥。基本认证简单但不安全;OAuth适用于授权第三方应用;JWT提供安全的身份验证信息传递;API密钥适合内部使用。选择方法时需平衡安全性、用户体验和开发复杂性。
847 0
|
存储 JSON 安全
探索JSON Web Token(JWT):现代身份验证和授权的利器
在现代Web应用中,用户身份验证和授权是保护数据和资源安全的重要环节。JSON Web Token(JWT)作为一种轻量级的身份验证和授权机制,为我们提供了一种安全且高效的方式来传递信息。本文将深入探讨JWT的基本概念、结构,以及如何在应用中实现安全的身份验证和授权。
274 0
|
存储 Web App开发 安全
Web身份验证(WebAuthn)(上)
Web身份验证(WebAuthn)(上)
|
前端开发 Java
Shiro框架学习笔记(三)与web集成之后进行简单的身份验证
Shiro框架学习笔记(三)与web集成之后进行简单的身份验证
Shiro框架学习笔记(三)与web集成之后进行简单的身份验证
|
2月前
|
XML JSON API
ServiceStack:不仅仅是一个高性能Web API和微服务框架,更是一站式解决方案——深入解析其多协议支持及简便开发流程,带您体验前所未有的.NET开发效率革命
【10月更文挑战第9天】ServiceStack 是一个高性能的 Web API 和微服务框架,支持 JSON、XML、CSV 等多种数据格式。它简化了 .NET 应用的开发流程,提供了直观的 RESTful 服务构建方式。ServiceStack 支持高并发请求和复杂业务逻辑,安装简单,通过 NuGet 包管理器即可快速集成。示例代码展示了如何创建一个返回当前日期的简单服务,包括定义请求和响应 DTO、实现服务逻辑、配置路由和宿主。ServiceStack 还支持 WebSocket、SignalR 等实时通信协议,具备自动验证、自动过滤器等丰富功能,适合快速搭建高性能、可扩展的服务端应用。
145 3