WebAuthn

其他类别 2025-08-24

WebAuthn

一个简单的PHP WebAuthn (FIDO2)服务器库

该项目的目标是提供一个小型,轻巧,易于理解的库,以使用Passkeys,Yubico或Solo等安全键,Android或Windows Hello上的指纹保护登录。

手动的

有关此库的简单用法,请参见 /_ Test。查看WebAuthn .lubu.ch的工作示例。

支持的证明语句格式

  • Android-key✅
  • Android-Safetynet✅
  • 苹果✅
  • fido-u2f✅
  • 包装✅
  • 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登录时,则可以通过直接证明验证其真实性。公司还可以购买具有自己的根证书签名的身份验证者,从而使他们能够验证身份验证者隶属于组织。

没有证明

只需验证该设备与注册中使用的设备相同。如果您仅检查“无”格式,则可以对此库使用“无”证明。

提示

如果您想为公共网站安全登录,这就是您想要使用的。

间接证明

浏览器可以用更友好的隐私友好和/或更容易验证的相同数据的版本(例如,使用匿名化CA)替换Aaguid和Agauid和证明语句。如果浏览器使用匿名证书,则无法对任何根CA进行验证。如果您选择多种格式,但没有提供任何root ca。

提示

混合灵魂,客户可能会因浏览器警告而灰心,但随后您知道他们正在使用的设备(Statistics Rulez!)

直接证明

浏览器提供了有关标识设备的数据,可以唯一地识别该设备。可以在多个站点上跟踪用户,因为浏览器可能会在注册时显示有关提供此数据的警告消息。如果您选择多种格式并提供root ca,则该库将证明设置为指导。

提示

如果您知道客户正在使用哪些设备并确保仅使用此设备,则可能是您想要的。

Passkeys /客户端可发现的凭据

客户端可发现的凭据源是公共密钥凭证源,其凭证私钥存储在身份验证器,客户端或客户端设备中。这样的客户端存储需要一个居民凭证的身份验证器。这仅由FIDO2硬件支持,而不是较旧的U2F硬件。

笔记

Passkeys是一种允许与其他设备共享存储在设备上的凭据。因此,从服务器的技术角度来看,客户端可发现的凭据没有区别。区别仅仅是手机或计算机系统会通过云服务自动同步用户设备之间的凭据。 PassKeys的跨设备同步由OS透明地管理。

它如何工作?

在典型的服务器端密钥管理过程中,用户通过输入其用户名以及某些情况下的密码来启动请求。服务器验证用户的凭据,并在成功身份验证后检索与该用户帐户关联的所有公共密钥标识符的列表。然后将此列表返回给身份验证者,该列表选择其发行的第一个凭据标识符,并以签名响应,可以使用注册过程中注册的公共密钥进行验证。

在客户端密钥过程中,用户无需提供用户名或密码。取而代之的是,身份验证器搜索自己的内存,以查看它是否为依赖方(域)保存了一个密钥。如果找到键,则身份验证过程以与服务器发送标识符列表相同的方式进行。验证过程没有差异。

如何将其与此库一起使用?

注册

调用WebAuthn WebAuthn ->getCreateArgs时,将$requireResidentKey设置为true,以通知身份验证者,他应该将注册保存在其内存中。

登录

调用WebAuthn WebAuthn ->getGetArgs时,请勿提供任何$credentialIds (身份验证者将在其内存中查找ID并将用户ID返回用户handle)。将身份验证器的类型设置为hybrid (通过QR代码扫描的PassKey)和internal (存储在设备本身上的Passkey)。

劣势

RP ID(=域)保存在身份验证器上。因此,如果丢失了身份验证者,则可以在理论上找到使用身份验证器并在此处登录的服务。

设备支持

可用的内置Passkeys自动同步到所有用户的设备:(另请参见Passkeys.dev/device-support)

  • 苹果iOS 16+ / iPados 16+ / macos ventura+
  • Android 9+
  • Microsoft Windows 11 23H2+

要求

  • php> = 8.0,带有openSSL和多键字符串
  • 浏览器具有WebAuthn支持(Firefox 60+,Chrome 67+,Edge 18+,Safari 13+)
  • ED25519支持的PHP钠(或钠兼容)

关于WebAuthn的信息

  • 维基百科
  • W3C
  • MDN
  • Dev.yubico
  • FIDO联盟
  • Passkeys

FIDO2硬件

  • 尤比科
  • 独奏开源!
  • Nitrokey
  • Feitan
  • TrustKey
  • Google Titan
  • 保护
  • Onespan
  • Hypersecu
  • Kensington Verimark™
  • token2
下载源码

通过命令行克隆项目:

git clone https://github.com/lbuchs/WebAuthn.git