Web身份验证(WebAuthn)(上)

简介: Web身份验证(WebAuthn)(上)

1、WebAuthn简介

WebAuthn 是FIDO联盟FIDO2规范集的核心组件,是一种基于Web的API,允许网站更新其登录页面,以便在支持的浏览器和平台上添加基于FIDO的身份验证。FIDO2使用户能够利用常见设备轻松地在移动的和桌面环境中对在线服务进行身份验证。

Web服务和应用程序可以-并且应该-打开此功能,通过生物识别技术,移动的设备和/或FIDO安全密钥为用户提供更轻松的登录体验-并且比单独的密码具有更高的安全性。

FIDO联盟决定与万维网国际标准组织万维网联盟(W3C)合作,为整个Web平台标准化FIDO身份验证。这种标准化将通过支持该标准的Web浏览器和Web应用服务器的整个社区来发展FIDO生态系统。

它允许服务器与现在内置于设备中的强身份验证器集成,如Windows Hello或Apple的Touch ID。为网站创建私钥-公钥对(称为 凭据 )而不是密码。私钥安全地存储在用户的设备上;公钥和随机生成的凭据 ID 将发送到服务器进行存储。然后,服务器可以使用该公钥来证明用户的身份。

公钥不是秘密的,因为如果没有相应的私钥,它实际上是无用的。服务器未收到任何机密这一事实对用户和组织的安全性具有深远的影响。数据库对黑客不再那么有吸引力,因为公钥对他们没有用。

FIDO联盟成员公司于2015年将FIDO规范提交给W3C进行正式标准化。然后,他们在W3C内部工作,最终确定了API,这被称为Web身份验证或WebAuthn。WebAuthn于2019年3月被正式认可为W3C Web标准。如今WebAuthn是FIDO联盟FIDO2规范的一部分,FIDO联盟运行认证程序以确保合规性。

什么是公钥密码?

公钥密码学发明于20世纪70年代,是解决共享秘密问题的一种方法。它是现代互联网安全的支柱;例如,每次我们连接到HTTPS网站时,都会发生公钥交易。

公钥加密使用密钥对的概念;一个私钥由用户安全存储,一个公钥可以与服务器共享。这些“密钥”是彼此具有数学关系的长随机数。

2、FIDO2:客户端到验证器协议(CTAP)

FIDO2的另一个组件,客户端到认证者协议(CTAP)

,是WebAuthn的补充。它使外部身份验证器(如安全密钥或移动的电话)能够与支持WebAuthn的浏览器一起使用,并且还可以用作桌面应用程序和Web服务的身份验证器。

3、浏览器和平台

WebAuthn目前在Google Chrome

、Mozilla  Firefox、Microsoft Edge和Apple Safari

Web浏览器以及Windows 10和Android

平台中得到支持。

浏览器兼容性如下:

4、Web身份验证API 基本流程

本节规范性地指定了用于创建和使用公钥凭据的API。基本的 这个想法是凭证属于用户并由WebAuthn Authenticator管理,WebAuthn依赖方通过客户端平台与WebAuthn Authenticator交互。 依赖方脚本可以(在用户同意的情况下)请求 浏览器以创建新凭证供信赖方将来使用。参见下图:

注册流程:

1、依赖方服务端开始准备用户信息,以及依赖方信息,这些属于公钥凭证创建相关内容选项。

2、把对应信息在依赖房应用程序通过WebAuthnAPI,生成依赖方id,用户信息,依赖方信息,客户数据哈希,把这些信息发送身份验证器进行验证。

3、身份验证器开始验证用户信息,会生成新的密钥对,和对应认证。

4、身份验证器,把新的公钥和认证id等相关认证信息返回。

5、经浏览器和依赖方js应用返回客户JOSN数据,认证对象信息,这一步是验证器认证响应。

6、服务端进行验证。

脚本还可以请求用户的权限,以便使用现有凭据执行身份验证操作。参见下图1、依赖方服务端发起询问,需要公钥认证请求需要的参数。

身份验证流程:

1、依赖方服务端发起询问,需要公钥认证请求需要的参数。

2、经依赖方JS应用,浏览器得到依赖方id,客户对应的哈希数据发送给身份验证器。

3、身份验证器开始验证用户信息,开始创建认证信息。

4、验证数据签名返回给浏览器。

5、经依赖方返回客户端的json数据,验证数据,签名等信息。

6、依赖方服务端

5、使用 WebAuthn API

5.1 注册WebAuthn凭据

在基于密码的用户注册流程中,服务器通常会向用户呈现一个表单,询问用户名和密码。密码将被发送到服务器进行存储。

在WebAuthn中,服务器必须提供将用户绑定到凭证(私钥-公钥对)的数据;该数据包括用户和组织(也称为“依赖方”)的标识符。然后,网站将使用Web身份验证API来提示用户创建新的密钥对。需要注意的是,我们需要从服务器随机生成的字符串作为挑战,以防止重放攻击。

navigator.credentials.create()

服务器将通过调用客户机上的navigator.credentials.create()开始创建新的凭据。

 

1. navigator.credentials.create({ publicKeyCredentialCreationOptions })
2.   .then(function (newCredentialInfo) {
3. // 发送新的凭证信息到服务器进行验证和注册.
4.   }).catch(function (err) {
5. // 没有可接受的身份验证者或用户拒绝同意。再做对应处理。
6.   });
publicKeyCredentialCreationOptions 对象包含许多必需和可选字段,服务器指定这些字段为用户创建新凭证。
1. const publicKeyCredentialCreationOptions  = {
2. // 在服务器上生成的加密随机字节的缓冲区,并且需要防止“重放攻击”。
3. challenge: bufferToBase64URLString(utf8StringToBuffer('sd')),
4. // 服务器希望从认证器接收证明数据(direct)
5. attestation: 'direct',
6. // 这是一个对象数组,描述服务器可以接受哪些公钥类型
7. // -7表示服务器接受使用SHA-256签名算法的椭圆曲线公钥
8. pubKeyCredParams: [
9.     {
10. alg: -7,
11. type: 'public-key',
12.     },
13.   ],
14. // 依赖方的id,是浏览器当前域名的子集
15. rp: {
16. id: 'duosecurity.dev',
17. name: 'duosecurity',
18.   },
19. // 用户信息
20. user: {
21. id: '5678',
22. displayName: 'username',
23. name: 'username',
24.   },
25. timeout: 1000,
26. // 希望限制在单个身份验证器上为同一帐户创建多个凭据的依赖方使用。
27. excludeCredentials: [
28.     {
29. id: 'C0VGlvYFratUdAV1iCw-ULpUW8E-exHPXQChBfyVeJZCMfjMFcwDmOFgoMUz39LoMtCJUBW8WPlLkGT6q8qTCg',
30. type: 'public-key',
31. transports: ['internal'],
32.     },
33.   ],
34. };

返回的create()对象是一个包含公钥和用于验证注册事件的其他属性的对象。

1. PublicKeyCredential {
2. // 新生成的凭证的ID;它将用于在认证用户时标识凭证。ID是一个base64编码的字符串
3. id: 'ADSUllKQmbqdGtpu4sjseh4cg2TxSvrbcHDTBsv4NSSX9...',
4. // 属性返回包含内部槽中的标识符
5. rawId: ArrayBuffer(59),
6. response: AuthenticatorAttestationResponse {
7. // 这表示从浏览器传递到身份验证器的数据,以便将新凭据与服务器和浏览器相关联。
8. // 验证器将其作为UTF-8字节数组提供。
9. clientDataJSON: ArrayBuffer(121),
10. // 此对象包含凭证公钥、可选的证明证书和其他用于验证注册事件的元数据。
11. // 它是以CBOR编码的二进制数据。
12. attestationObject: ArrayBuffer(306),
13.     },
14. type: 'public-key'
15. }

解析clientDataJSON数据:

1. // decode the clientDataJSON into a utf-8 string
2. const utf8Decoder = new TextDecoder('utf-8');
3. const decodedClientData = utf8Decoder.decode(
4.     credential.response.clientDataJSON)
5. 
6. // parse the string as an object
7. const clientDataObj = JSON.parse(decodedClientData);
8. 
9. console.log(clientDataObj)
10. 
11. {
12. // 这是传递到create()调用中的challenge是否相同
13. challenge: "p5aV2uHXr0AOqUk7HQitvi-Ny1....",
14. // 服务器必须验证这个“origin”字符串与应用程序的源代码匹配。
15. origin: "https://webauthn.guide",
16. // 服务器验证该字符串是不是"webauthn.create",否则可能执行不正确的操作。
17. type: "webauthn.create",
18. // 客户端和callerOrigin之间的令牌绑定状态
19. tokenBinding: {  // 如果缺失,表示客户端不支持令牌的绑定
20. // status存在,则该成员必须存在,
21. // 并且必须是与依赖方通信时使用的令牌绑定ID的base64url编码
22. id:'ASAFDQWE12312aasDASD......';
23. // supported 支持令牌绑定,但与依赖方通信时未协商
24. // present 与依赖方通信时使用了令牌绑定,id必须存在
25. status: 'present' | 'supported'';
26.     }
27. 
28. }


相关文章
|
12天前
|
存储 JSON 数据安全/隐私保护
"FastAPI身份验证与授权的奥秘:如何用Python打造坚不可摧的Web应用,让你的项目一鸣惊人?"
【8月更文挑战第31天】在现代Web开发中,保证应用安全性至关重要,FastAPI作为高性能Python框架,提供了多种身份验证与授权方式,包括HTTP基础认证、OAuth2及JWT。本文将对比这些机制并附上示例代码,展示如何使用HTTP基础认证、OAuth2协议以及JWT进行用户身份验证,确保只有合法用户才能访问受保护资源。通过具体示例,读者可以了解如何在FastAPI项目中实施这些安全措施。
37 1
|
21天前
|
JavaScript 安全 前端开发
Node.js身份验证全攻略:策略与实践,打造坚不可摧的Web应用安全防线!
【8月更文挑战第22天】Node.js作为强大的服务器端JavaScript平台,对于构建高效网络应用至关重要。本文探讨其身份验证策略,涵盖从基于token至复杂的OAuth 2.0及JWT。Passport.js作为认证中间件,支持本地账号验证及第三方服务如Google、Facebook登录。同时介绍JWT轻量级验证机制,确保数据安全传输。开发者可根据应用需求选择合适方案,注重安全性以保护用户数据。
28 1
|
28天前
|
开发框架 JSON .NET
ASP.NET Core 标识(Identity)框架系列(三):在 ASP.NET Core Web API 项目中使用标识(Identity)框架进行身份验证
ASP.NET Core 标识(Identity)框架系列(三):在 ASP.NET Core Web API 项目中使用标识(Identity)框架进行身份验证
|
12天前
|
存储 安全 测试技术
Web2py中的身份验证与授权之谜:如何让你的Web应用飞起来?
【8月更文挑战第31天】在Web开发中,确保应用安全性至关重要,Web2py作为Python Web框架,提供了强大的身份验证与授权功能。本文探讨了Web2py的身份验证(包括表单验证、密码加密及会话管理)与授权(涵盖角色权限、URL过滤及用户组管理)。通过示例代码展示了用户模型定义、角色关系设置及登录流程处理等关键步骤。合理利用这些功能并结合最佳实践如使用内置验证、灵活控制访问权限及编写测试,可帮助开发者高效构建安全稳定的应用程序。
8 0
|
4月前
|
JSON 安全 API
【专栏】四种REST API身份验证方法:基本认证、OAuth、JSON Web Token(JWT)和API密钥
【4月更文挑战第28天】本文探讨了四种REST API身份验证方法:基本认证、OAuth、JSON Web Token(JWT)和API密钥。基本认证简单但不安全;OAuth适用于授权第三方应用;JWT提供安全的身份验证信息传递;API密钥适合内部使用。选择方法时需平衡安全性、用户体验和开发复杂性。
524 0
|
前端开发 区块链 数据安全/隐私保护
web3 的身份验证之以太坊签名消息
如果参与过以太坊 DApp 相关的开发,可能遇到过要求签名一条消息或一条数据以验证自己(以及哈希地址)。本文将讨论以太坊签名数据的基础知识。
1900 0
web3 的身份验证之以太坊签名消息
|
存储 JSON 安全
探索JSON Web Token(JWT):现代身份验证和授权的利器
在现代Web应用中,用户身份验证和授权是保护数据和资源安全的重要环节。JSON Web Token(JWT)作为一种轻量级的身份验证和授权机制,为我们提供了一种安全且高效的方式来传递信息。本文将深入探讨JWT的基本概念、结构,以及如何在应用中实现安全的身份验证和授权。
234 0
|
Web App开发 存储 算法
Web身份验证(WebAuthn)(下)
Web身份验证(WebAuthn)(下)
|
前端开发 Java
Shiro框架学习笔记(三)与web集成之后进行简单的身份验证
Shiro框架学习笔记(三)与web集成之后进行简单的身份验证
Shiro框架学习笔记(三)与web集成之后进行简单的身份验证
|
11天前
|
数据库 开发者 Python
web应用开发
【9月更文挑战第1天】web应用开发
26 1