WebAuthn 无密码身份认证

news2024/11/25 18:30:06

在这里插入图片描述

文章目录

  • WebAuthn简介
  • 工作原理
  • 组成部分
  • 架构实现
  • 注册认证
  • 应用场景
  • 案例演示

WebAuthn简介

WebAuthn,全称 Web Authentication,是由 FIDO 联盟(Fast IDentity Online Alliance)和 W3C(World Wide Web Consortium)联合制定的一套新的身份认证标准,旨在为网络身份验证提供一种更强大、更安全的方式,使用户能够使用他们的设备(如手机、USB 密钥或生物识别器)来进行身份验证,而无需使用密码。该项目的目标是标准化用户对基于 Web 的应用程序和服务的公钥认证的接口。

WebAuthn 使用 asymmetric(public-key)cryptography(不对称加密)替代密码或SMS文本在网站上注册,验证,second-factor authentication(双因素验证)解决了phishing(钓鱼),data breaches(数据破坏),SMS 文本攻击,其他双因素验证等重大安全问题,同时显著提高易用性(因为用户不必管理许多越来越复杂的密码)。

WebAuthn 支持的生物验证方式包括:笔记本电脑的指纹识别和面部识别、安卓设备的指纹识别。追求高安全的用户还可额外购买兼容FIDO的实体安全密钥,FIDO完整支持包括:指纹识别、面部识别、虹膜识别、声音识别、实体密钥(USB连接、蓝牙连接、NFC连接),支持设备系统包括:Windows 、Linux、Mac OS、Android、IOS、智能手表等。

注:FIDO 联盟是一个非营利性组织,由 Google、微软、苹果、三星、高通、芯片厂商、支付公司、银行、电信运营商、认证公司等组成,旨在为用户提供更安全、更简单的身份验证体验。

工作原理

WebAuthn 的原理并不复杂,它的核心是基于公钥的加密技术。在 WebAuthn 中,用户的身份认证是通过公钥和私钥来实现的。这很像我们平常使用配置了公私钥的 SSH 登录服务器的过程,只不过 WebAuthn 是在浏览器中实现的。

组成部分

WebAuthn 由以下三个组成部分组成:

  1. 用户代理(User Agent):用户代理是指浏览器或者其他支持 WebAuthn 的客户端,它负责与用户进行交互,收集用户的身份认证信息,并将其发送给服务器。
  2. 身份验证器(Authenticator):身份验证器是指用于生成公钥和私钥的设备,如手机、USB 密钥或生物识别器。Windows Hello 和 macOS 的 Touch ID 也都是常见的身份验证器。
  3. Relying Party:Relying Party 是指需要进行身份认证的网站或应用程序,它负责生成挑战(Challenge)并将其发送给用户代理,然后验证用户代理发送的签名结果

上述三者在两个不同的用例(注册和认证)中协同工作,如下图所示。图中的各个实体之间的所有通信都由用户代理(通常是Web浏览器)处理。

在这里插入图片描述

架构实现

WebAuthn 用公钥证书代替了密码,完成用户的注册和身份认证(登录)。它更像是现有身份认证的增强或补充。为了保证通信数据安全,一般基于HTTPS(TLS)通信。在这个过程中,有4个模块。

Server(服务端)

它可以被认为一个依赖方(Relying Party),它会存储用户的公钥并负责用户的注册认证

JavaScript(Js脚本)

调用浏览器API,与Server进行通信,发起注册或认证过程

Browser(浏览器)

需要包含WebAuthn的Credential Management API提供给js调用,还需要实现与认证模块进行通信,由浏览器统一封装硬件设备的交互。

Authenticator(认证模块)

它能够创建、存储、检索身份凭证。它一般是个硬件设备(智能卡、USB,NFC等),也可能已经集成到了你的操作系统(比如Windows Hello,MacOS的Touch ID等)。

注册认证

完整注册认证过程:

1)应用请求注册

应用程序发出注册请求,服务端提供api由前端js调用发起注册请求;

2)服务端返回注册数据

服务器将挑战码、用户信息和依赖方信息发送回应用程序。

challenge:挑战码必须是随机的 buffer(至少 16 字节),并且必须在服务器上生成以确保安全。

user info:用户信息,服务端需要知道当前谁来注册,正常应用场景中,第一步需要在其他辅助认证的情况下获取当前合法用户信息,比如第一步传输静态用户名密码来做一次校验,服务器认可当前是一个合法用户请求注册;

relying party info:服务端上下文,包含AuthenticatorAttestationResponse 的 PublicKeyCredential

3)浏览器调用认证器

请求认证器创建认证证书,浏览器生成客户端数据(clientData)生成clientDataHash(由挑战码,服务端上下文 的 SHA-256 哈希)传输给认证器;

4)认证器创建密钥对

认证器通常会以某种形式要求用户确认密钥器的所属,如输入 PIN,使用指纹,进行虹膜扫描等,以证明用户在场并同意注册。验证通过后,认证器将创建一个新的非对称密钥对,并安全地存储私钥以供将来验证使用。公钥则将成为证明的一部分,被在制作过程中烧录于认证器内的私钥进行签名。这个私钥会具有可以被验证的证书链。

5)认证器数据返回浏览器

返回数据包括新的公钥全局唯一的凭证ID认证凭证数据(Attestation object l包含FIDO的元数据)会被返回到浏览器。

6)浏览器打包数据,发送到服务端

包含公钥全局唯一的凭证ID认证凭证数据客户端数据(clientData);其中认证凭证数据包含了clientDataHash,可以确定当前生成的公钥是分配给当前请求注册的用户。

7)服务端完成注册

收到客户端发送的注册请求,服务器需要执行一系列检查以确保注册完成且数据未被篡改。步骤包括:

a.检查账号信息,是否是服务端的存在的账号。

b.确保由身份验证程序签名的挑战码与服务器生成的挑战码匹配。

c.使用对应认证器型号的证书链验证 clientDataHash 的签名和验签。

验证步骤的完整列表可以在 WebAuthn 规范中找到。一旦验证成功,服务器将会把新的公钥与用户账户相关联以供将来用户希望使用公钥进行身份验证时使用。

WebAuthn 的注册流程

在这里插入图片描述

注册时,用户端会生成一对公钥私钥。其中,私钥存储在本地,而公钥则发送给服务器,服务端会将公钥与用户账户进行关联 。详细的流程如下图所示:

在这里插入图片描述

WebAuthn 的认证流程

在这里插入图片描述

在认证时,用户端会使用私钥对服务器端发送的挑战(Challenge)进行签名,然后将签名结果发送给服务器。服务器端会使用公钥对签名结果进行验证,从而完成身份认证。详细的流程如下图所示:

在这里插入图片描述

你可以在 https://webauthn.me/ 上体验 WebAuthn 的注册和认证过程。

应用场景

Webauthn 提供了一个安全的无密码认证标准,彻底抛弃了密码,并且统一由操作系统完成安全硬件设备和生物特征识别的集成及管理,浏览器调用操作系统进行提供的能力形成认证器,应用开发者按标准与浏览集成即可完成FIDO认证,无需关心硬件设备的兼容和生物特征的算法,使得应用开发者集成FIDO认证抛弃密码更加容易和安全。

场景一:集成Windows Hello认证

Win10系统的Windows hello模块,本身可以集成人脸、指纹、pin码等认证方式,在windows上运行的web应用注册或认证时可以通过浏览器直接与windows hello集成获取用户身份凭证进行认证;

场景二:集成MacOS Touch ID认证

MacBook系统自带Touch ID集成指纹认证,浏览器通过接口可以直接唤醒mac的Touch ID进行认证;支持Webauthn的web应用可以直接使用TouchID进行登录;

场景三:集成Android指纹认证

由于Android系统厂商的异构,不同手机厂商会有不同的人脸识别或指纹识别模块,通过Webauthn由系统层面封装了与生物设备对接,应用系统就无需关心Android系统的异构行,直接使用手机的生物认证登录;

场景四:集成IOS人脸认证

iPhone系统自带Face ID集成人脸认证,浏览器通过接口可以直接唤醒Face ID进行认证;支持Webauthn的web应用可以直接使用Face ID进行登录;

场景五:使用YubiKey认证

YubiKey是一个外置的ukey存储用户私钥来进行webauthn认证,其可以同时支持pc和移动app;pc模式下通过usb接口访问,移动app模式下通过nfc访问;

WebAuthn存在的缺点:

WebAuthn 依赖于浏览器与认证模块通讯,那么必须使用最新的浏览方可支持。在无浏览器情况下如CS应用或移动APP无法简便的使用。

WebAuthn 设计的目标是解决认证,用户一旦通过认证,就可以访问所有资源,在零信任架构中不能允许一次认证永久使用的场景存在。

案例演示

前端案例项目
后端案例项目

使用SpringBoot+JavaScript集成Windows Hello认证,用户信息分别存入MySQLRedis

在这里插入图片描述

数据库信息

在这里插入图片描述

Redis信息

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1639708.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【跟马少平老师学AI】-【神经网络是怎么实现的】(八)循环神经网络

一句话归纳: 1)词向量与句子向量的循环神经网络: x(i)为词向量。h(i)为含前i个词信息的向量。h(t)为句向量。 2)循环神经网络的局部。 每个子网络都是标准的全连接神经网络。 3)对句向量增加全连接层和激活函数。 每个…

【Web】CTFSHOW 新手杯 题解

目录 easy_eval 剪刀石头布 baby_pickle repairman easy_eval 用script标签来绕过 剪刀石头布 需要赢100轮🤔 右键查看源码拿到提示 一眼session反序列化 打PHP_SESSION_UPLOAD_PROGRESS 脚本 import requestsp1 a|O:4:"Game":1:{s:3:"log…

如何将 redis 快速部署为 docker 容器?

部署 Redis 作为 Docker 容器是一种快速、灵活且可重复使用的方式,特别适合开发、测试和部署环境。本文将详细介绍如何将 Redis 部署为 Docker 容器,包括 Docker 安装、Redis 容器配置、数据持久化、网络设置等方面。 步骤 1:安装 Docker 首…

NI CRIO 9045 LABVIEW2020

1.labview工程如果要访问CRIO,需要设置以下,否则在项目中连接失败。 2.项目中如果要传文件,需要安装WebDEV 3.使用WebDAV将文件传输到实时(RT)目标 https://knowledge.ni.com/KnowledgeArticleDetails?idkA03q000000YGytCAG&lzh-CN

34.Docker基本操作

镜像相关的命令 镜像名称分为两部分组成:[repository]:[tag],tag就是镜像的版本。如果tag没有指定默认就是latest,表示最新版本的镜像。 查看docker命令的帮助信息 docker --help 具体某条命令的帮助信息 docker images --help 案例一:从DockerHub中…

【Vue3】openlayers加载瓦片地图并手动标记坐标点

目录 一、创建Vue3项目 二、openlayers加载瓦片地图(引js文件版) 2.1 将以下的文件复制到public下 2.2 index.html引入ol脚本 2.3 删除项目自带的HelloWorld.vue,创建Map.vue 2.4 编码Map.vue 2.5 修改App.vue 2.6 启动项目测试 三、…

数据分析--客户价值分析RFM(K-means聚类/轮廓系数)

原数据 import os import pandas as pd import numpy as np import matplotlib.pyplot as plt import seaborn as sns from sklearn import metrics ### 数据抽取,读⼊数据 df pd.read_csv("customers1997.csv") #相对路径读取数据 print(df.info()) pr…

探索科技园区的创新应用架构

在当今科技快速发展的时代,科技园区已经成为了创新和技术发展的孵化器和聚集地。在这样的环境中,科技园区的应用架构扮演着至关重要的角色,它不仅需要支持各种创新型企业和科技项目的发展,还需要提供高效的技术基础设施和服务。下…

《架构即未来》读后感

目录 一、引言 二、《架构即未来》读后感 1、主题的简要介绍 2、我的看法和理解 3、作者的优点和传递的信息 4、思想如何适用于当今社会 三、《架构即未来》对于企业发展的影响具体体现在哪些方面? 一、引言 任何一个持续成长的公司最终都需要解决系统、组织…

是谁在丢盔弃甲?

原创 | 刘教链 继BTC(比特币)跌破关键心理位置6万刀、短促急降至56.5k之后,暂时技术性反弹至58.5k一线。有悲观者说,这是牛市的结束,一切都完了。说这种话的人,或者轻信这种话的人,想必都是些“…

微调Mistral 7B以实现命名实体识别 (NER)

文章来源:fine-tuning-mistral-7b-for-named-entity-recognition-ner 2024 年 4 月 19 日 在自然语言处理(NLP)领域,命名实体识别(NER)被认为是一项关键任务,应用范围广泛,包括信息…

k8s部署maven项目

failed to verify certificate: x509: certificate signed by unknown authority 今天在执行kubectl get nodes的时候报的证书验证问题,看了一圈首次搭建k8s的都是高频出现的问题。 couldn’t get current server API group list: Get “https://kubernetes.docker…

C#描述-计算机视觉OpenCV(3):重映射

C#描述-计算机视觉OpenCV(3):重映射 前言色彩波形图像重映射 前言 C#描述-计算机视觉OpenCV(1):基础操作 C#描述-计算机视觉OpenCV(2):图像处理 在前文中,描…

R语言学习—4—数据矩阵及R表示

1、创建向量、矩阵 在R中,c()函数用于创建向量或组合数据对象。它在某些情况下可能会被省略,因为R有一些隐式的向量创建规则。例如,当你使用:操作符创建一个数字序列时,R会自动创建一个向量,所以你不需要显式地调用c()…

超越数据的确定性:通过概率主成分分析拥抱不确定性

原文地址:beyond-determinism-in-data-embracing-uncertainty-with-probabilistic-principal-component-analysis 2024 年 4 月 24 日 主成分分析法(Principal Component Analysis,PCA)是一种统计方法,它可以通过正交…

蓝桥杯备战国赛1

开心的金明 火烧赤壁 南蛮图腾 #include<iostream> #include<algorithm> #include<cmath> using namespace std; int n, m; int v[30], k[30]; int arr[30010][30]; int main() {cin >> n >> m;for (int i 1;i < m;i){cin >> v[i] &g…

自定义表单元素组件内容变化触发ElForm重新校验

对于下图中“付费类型”怎么实现有很多种方式&#xff0c;我能想到的是以下两种&#xff1a; Element Plus的RadioButton自定义组件 1. RadioButton 它本质上就是一个单选组件&#xff0c;它跟Element Plus的RadioButton本质上没有区别&#xff0c;无非是外观上的差别。那么…

基于SpringBoot+Vue的旅游网站系统

初衷 在后台收到很多私信是咨询毕业设计怎么做的&#xff1f;有没有好的毕业设计参考?能感觉到现在的毕业生和当时的我有着同样的问题&#xff0c;但是当时的我没有被骗&#xff0c;因为现在很多人是被骗的&#xff0c;还没有出学校还是社会经验少&#xff0c;容易相信别人。…

BJFUOJ-C++程序设计-实验2-类与对象

A 评分程序 答案&#xff1a; #include<iostream> #include<cstring>using namespace std;class Score{ private:string name;//记录学生姓名double s[4];//存储4次成绩&#xff0c;s[0]和s[1]存储2次随堂考试&#xff0c;s[2]存储期中考试&#xff0c;s[3]存储期…

003 redis分布式锁 jedis分布式锁 Redisson分布式锁 分段锁

文章目录 Redis分布式锁原理1.使用set的命令时&#xff0c;同时设置过期时间2.使用lua脚本&#xff0c;将加锁的命令放在lua脚本中原子性的执行 Jedis分布式锁实现pom.xmlRedisCommandLock.javaRedisCommandLockTest.java 锁过期问题1乐观锁方式&#xff0c;增加版本号(增加版本…