protonlabs / webauthn
Requires
- php: >=7.1
This package is not auto-updated.
Last update: 2022-08-10 08:26:30 UTC
README
WebAuthn
一个简单的PHP WebAuthn (FIDO2) 服务器库
本项目旨在提供一个小型、轻量、易于理解的库,用于保护使用Yubico或Solo等安全密钥、Android或Windows Hello指纹的生物登录。
手册
查看/_test以了解此库的简单用法。请访问webauthn.lubu.ch以查看一个工作示例。
支持的证明声明格式
- android-key ✅
- android-safetynet ✅
- apple ✅
- fido-u2f ✅
- none ✅
- packed ✅
- tpm ✅
此库支持使用X.509证书签名的验证器或自证明的验证器。不支持ECDAA。
工作流程
JAVASCRIPT | SERVER
------------------------------------------------------------
REGISTRATION
window.fetch -----------------> getCreateArgs
|
navigator.credentials.create <-------------'
|
'-------------------------> processCreate
|
alert ok or fail <----------------'
------------------------------------------------------------
VALIDATION
window.fetch ------------------> getGetArgs
|
navigator.credentials.get <----------------'
|
'-------------------------> processGet
|
alert ok or fail <----------------'
证明
什么是证明?通常,你只需要验证登录来自与注册时使用的相同设备。对于这个用例,你不需要任何证明。如果你需要更高的安全性,比如当你知道你公司的登录每个人都使用solokey时,你可以通过直接证明来验证,这个设备确实是solokey。公司甚至可以购买使用公司自签名根证书签名的验证器,然后你可以验证验证器是否是公司之一。
无证明
只需验证设备是注册时使用的同一设备。如果你只检查'none'格式,则可以使用此库进行'none'证明。
- 如果你想要像github、facebook、google等一样简单的2FA登录保护,这可能是你想要使用的。
间接证明
浏览器可能会用更隐私友好和/或更易于验证的同一数据版本(例如,通过使用匿名化CA)替换AAGUID和证明声明。如果浏览器使用匿名化证书,则无法针对任何根CA进行验证。如果选择多个格式但未提供任何根CA,则此库将证明设置为间接。
- 混合解决方案,客户端可能会因为浏览器警告而受到挫败,但你知道他们使用的是什么设备(统计数据规则!)
直接证明
浏览器提供了标识设备的数据,该设备可以唯一地识别。用户可能会因为多个站点而跟踪,因此浏览器可能会在注册时显示警告信息提供此数据。如果你选择多个格式并提供根CA,则此库将证明设置为直接。
- 如果你知道你的客户端使用什么设备并确保只使用这些设备,这可能是你想要的。
常驻凭证
客户端驻留的公钥凭证源,简称驻留凭证,是一种其凭证私钥存储在验证器、客户端或客户端设备中的公钥凭证源。这种客户端存储需要驻留凭证验证器。这仅由FIDO2硬件支持,不支持旧U2F硬件。
它是如何工作的?
在正常的服务器端密钥处理过程中,用户输入其用户名(可能还有密码),然后服务器回复用户已注册的所有公钥凭证标识符。然后,验证器取提供的凭证标识符列表中的第一个,即由自己签发的,并响应一个可以使用注册时提供的公钥验证的签名。在客户端密钥处理过程中,用户不需要提供用户名或密码。服务器不发送任何标识符;相反,验证器在其自身内存中查找,是否为此依赖方保存了密钥。如果有的话,他将像提供标识符列表一样做出响应,检查注册没有区别。Windows 10(Firefox、Chromium)支持驻留凭证。旧操作系统如Windows 7的浏览器会回退到FIDO U2F,它不支持驻留凭证。
我如何使用这个库?
在注册时
当调用WebAuthn\WebAuthn->getCreateArgs
时,将$requireResidentKey
设置为true,以通知验证器它应该在内存中保存注册。
在登录时
当调用WebAuthn\WebAuthn->getGetArgs
时,不要提供任何$credentialIds
(验证器将在其自身内存中查找ID)。