文章目录
- 什么是FIDO
- webauthn
- 部署运行
- 访问测试
本文对fido基本概念进行总结说明,并部署运行一个实际的例子,可以直观的体验fido无密码认证。晚上的例子方便后续实现相关功能。
什么是FIDO
常见认证方式的问题
目前流行认证方式普遍存在一些问题
用户名密码模式:密码太复杂不容易记忆,而且当系统、应用很多时为了省事儿往往多个系统/应用都采用相同的密码。因此存在撞库、暴力破解等隐患
动态密码模式:U盾 动态令牌,各个厂商不统一,每个应用都需要有一套,且Ukey需要后端的管理服务器人工维护用户和ukey。短信验证码依赖手机面临手机丢失、基站伪造等问题。
生物特征认证:只在手机端普及,PC使用较少。生物特征如果被采集到服务器端存在泄露的隐患。
FIDO的诞生
为了解决上述问题, 在线快速身份验证联盟于2012年成立,它的目标是创建一套开放、可扩展的标准协议,支持对Web应用的非密码安全认证,消除或减弱用户对密码的依赖。FIDO就是这样一种可扩展的标准协议,全称为Fast Identity Online。
FIDO共有两个版本,1.0和2.0
1.0 主要通过两个标准协议来实现安全登录(验证):分为两大类U2F和UAF
U2F类似于国内的二代U盾的保护机制,相当于双因素认证。使用双因子(密码和能与用户交互的设备)保护用户账户个隐私。当进行验证时,服务器在合适的时候,提示用户插入设备并进行按键操作,加密设备对数据签名,发送给服务器,服务器做验证,如果验证成功,用户则可登录成功。由于有了第二因子(加密设备)的保护,用户可以选择不设置密码或者使用一串简单易记的4位密码
UAF则是支持指纹,语音,虹膜,脸部识别等生物身份识别方式。无需用户密码介入,直接进行验证交易。用户在注册阶段,根据服务器支持的本地验证方式,选择一种验证方式,如指纹识别,人脸识别,语音识别等等,服务器也可以保留密码验证方式,将密码和生物相结合,增强账户安全性。
2.0是由 FIDO 联盟和 W3C 共同推出的 U2F(现称作 FIDO1)的后继标准,善了1.0中还未形成的U2F规范,制定了身份验证器和浏览器(用户端)的API。使用CTAP(身份验证器 API)和Webauthn(浏览器 API)实现U2F。 增加了单因素认证功能,也就是不再需要用户名密码,真正实现无密码登录。包含WebAuthn、 Client to Authenticator Protocol 2(CTAP2,客户端-认证器协议)、U2F 和 UAF 四个部分:
WebAuthn:是用于网站和访客设备交互的
Client to Authenticator Protocol 2(CTAP2,客户端-认证器协议)作为 WebAuthn 的补充,则是用于访客的设备和认证器交互的协议。
webauthn
webAuthn,即 Web Authentication,FDIO2协议的一部分。被认为是 Web 身份认证的未来。WebAuthn 最常见的应用就是用于网站登录时的 2FA(双重因素验证)或无密码登录。通过网页调用 WebAuthn,在不同平台下,我们可以实现通过 USB Key、指纹、面部甚至虹膜扫描来认证身份,同时确保安全和隐私。
使用 WebAuthn 分为两个部分,注册和验证。注册会将认证器的一些信息和用户建立关联;而验证则是验证这些信息以登确保是用户本人在登录。注册时认证器生成一对公私钥,然后将公钥交给服务器;验证阶段是服务器发送给认证器一段文本,要求认证器用自己的私钥加密后发回以验证。
注册流程:
浏览器向依赖方发送某个用户的注册请求
依赖方向浏览器发送挑战、依赖方信息和用户信息
浏览器向认证器发送挑战、依赖方信息、用户信息和客户端信息以请求创建公钥凭证
认证器请求用户动作,随后创建一对公私钥,并使用私钥签名挑战(即证明),和公钥一起交给浏览器
浏览器将签名后的挑战和公钥发送给依赖方
依赖方用公钥验证挑战是否与发送的一致,如果成功则将公钥与用户绑定,注册完成。
验证流程:
浏览器向依赖方发送某个用户的验证请求
依赖方向浏览器发送挑战
浏览器向认证器发送挑战、依赖方信息和客户端信息以请求获取公钥凭证
认证器请求用户动作,随后通过依赖方信息找到对应私钥,并使用私钥签名挑战(即断言),交给浏览器
浏览器将签名后的挑战发送给依赖方
依赖方用之前存储的公钥验证挑战是否与发送的一致,一致则验证成功
在整个过程中并没有隐私数据被传输——用户信息实际上只包含用户名和用户 ID
目前webauthn被大部分主流浏览器支持,但是部分浏览器或环境下可能存在限制,具体请查阅相关资料
部署运行
目前webauthn已经有很多开源实现,在网站https://webauthn.io/ 上提供了类库和示例,我们直接下载如下示例进行运行测试
代码下载
执行 git clone https://github.com/vertx-howtos/fido2-webauthn-howto.git 下载工程代码
创建证书
根据git上的提示我们先创建项目需要的证书,我们要部署的该服务器的服务器IP是 192.168.18.10,创建证书使用的密码为 123456
执行以下命令完成证书文件的创建
[root@localhost ~]# keytool \
> -genkeypair \
> -alias rsakey \
> -keyalg rsa \
> -storepass 123456 \
> -keystore certstore.jks \
> -storetype JKS \
> -dname "CN=192.168.18.10.nip.io,O=Vert.x Development"
Warning:
JKS 密钥库使用专用格式。建议使用 "keytool -importkeystore -srckeystore certstore.jks -destkeystore certstore.jks -deststoretype pkcs12" 迁移到行业标准格式 PKCS12。
[root@localhost ~]# keytool \
> -importkeystore \
> -srckeystore certstore.jks \
> -destkeystore certstore.jks \
> -deststoretype pkcs12
输入源密钥库口令:
已成功导入别名 rsakey 的条目。
已完成导入命令: 1 个条目成功导入, 0 个条目失败或取消
Warning:
已将 "certstore.jks" 迁移到 Non JKS/JCEKS。将 JKS 密钥库作为 "certstore.jks.old" 进行了备份。
[root@localhost ~]# ll
总用量 12
-rw-------. 1 root root 1232 10月 29 04:13 anaconda-ks.cfg
drwxr-xr-x. 3 root root 106 10月 28 21:11 apps
-rw-r--r--. 1 root root 2487 4月 24 22:51 certstore.jks
-rw-r--r--. 1 root root 2148 4月 24 22:51 certstore.jks.old
编译代码
用编译工具打开项目代码,最好自己了解下 代码结构及源码的意义,这里我也是被里边的依赖困扰了一阵子。
执行maven构建,打包成功
可以点击下载我编译好的程序包
上传程序包
[root@localhost ~]# rz
rz waiting to receive.
Starting zmodem transfer. Press Ctrl+C to cancel.
100% 6383 KB 6383 KB/s 00:00:01 0 Errors
[root@localhost ~]# ll
总用量 6396
-rw-------. 1 root root 1232 10月 29 04:13 anaconda-ks.cfg
drwxr-xr-x. 3 root root 106 10月 28 21:11 apps
-rw-r--r--. 1 root root 2487 4月 24 22:51 certstore.jks
-rw-r--r--. 1 root root 2148 4月 24 22:51 certstore.jks.old
-rw-r--r--. 1 root root 6536315 4月 24 22:55 fido2-1.0.0-SNAPSHOT.jar
执行如下命令启动服务
[root@localhost ~]# java -jar fido2-1.0.0-SNAPSHOT.jar
Server: https://192.168.18.10.nip.io:8443
四月 24, 2023 11:01:49 下午 io.vertx.core.impl.launcher.commands.VertxIsolatedDeployer
信息: Succeeded in deploying verticle
如上提示服务地址为: https://192.168.18.10.nip.io:8443
访问测试
打开浏览器 输入如上地址 https://192.168.18.10.nip.io:8443,可以看到demo简陋的页面
因为我们电脑没有ukey等工具,可以可以使用浏览器自带的 模拟工具,如果不开启这个工具 浏览器会让我们选择验证方式
完成注册和登录前我们访问 系统内容 提示没有权限
开启模拟工具 配置如下:
点击 Register直接提示注册成功。
这个时候在此访问 secret info 可以正常访问
使用手机连接到局域网访问这个地址可以直接使用手机的指纹认证来完成注册和登录