如何使用FIDO U2F允许用户通过我的网站进行身份验证?

761*_*287 34 authentication google-chrome fido-u2f

随着最近关于FIDO U2F规范的讨论,我想在测试平台上逐步实施FIDO U2F,为即将推出的最终规范做好准备.

到目前为止,我有一个由Yubico生产的FIDO U2F安全密钥和安装在Chrome中的FIDO U2F(通用第二因子)扩展.我还设法设置安全密钥以使用我的Google登录.

现在,我不确定如何在我自己的网站上使用这些东西.我查看了Google的Github页面,了解了U2F项目,并检查了他们的Web应用程序前端.它看起来很简单(仅限JavaScript).那么使用FIDO实现第二个因子auth就像实现一些JavaScript调用一样简单吗?在示例中注册的所有内容似乎都是:

      var registerRequest = {
            appId: enrollData.appId,
            challenge: enrollData.challenge,
            version: enrollData.version
      };

      u2f.register([registerRequest], [], function (result) {
          if (result.errorCode) {
        document.getElementById('status')
          .innerHTML = "Failed. Error code: " + result.errorCode;
        return;
          }
          document.location = "/enrollFinish"
          + "?browserData=" + result.clientData
          + "&enrollData=" + result.registrationData
          + "&challenge=" + enrollData.challenge
          + "&sessionId=" + enrollData.sessionId;             
      });
Run Code Online (Sandbox Code Playgroud)

但是我如何将自己用于实现呢?我是否可以使用此方法调用的回调进行用户注册?

mri*_*z_p 49

您要做的是实现所谓的"依赖方",这意味着您的Web服务将依赖于FIDO U2F令牌提供的身份断言.

您需要了解U2F规范才能做到这一点.特别是如何实施挑战 - 响应范例以及应用程序和方面如何工作.这在规范中有详细描述.

你是对的:从你的应用程序的前端使用FIDO U2F所需的实际代码几乎是微不足道的(也就是说,如果你使用"高级"JavaScript API而不是"低级"MessagePort API) .但是,您的应用程序需要使用令牌生成的消息并对其进行验证.这不是微不足道的.

为了说明如何实现依赖方站点,我将提供一些代码示例,这些示例来自我最近因学术原因编写的虚拟FIDO U2F令牌扩展.您可以看到完整示例代码的页面.


在您的用户使用他们的FIDO U2F令牌进行身份验证之前,他们需要向您注册.为了允许他们这样做,您需要window.u2f.register在他们的浏览器中调用.为此,您需要提供一些参数(再次;阅读规范以获取详细信息).其中一个挑战和你的应用程序的ID.对于Web应用程序,此ID必须是触发FIDO操作的Web页面的Web原点.我们假设它是example.org:

window.u2f.register([
    {
        version : "U2F_V2",
        challenge : "YXJlIHlvdSBib3JlZD8gOy0p",
        appId : "http://example.org",
        sessionId : "26"
    }
], [], function (data) {

});
Run Code Online (Sandbox Code Playgroud)

一旦用户执行"用户存在测试"(例如,通过触摸令牌),您将收到一个响应,这是一个JSON对象(有关更多详细信息,请参阅规范)

dictionary RegisterResponse {
    DOMString registrationData;
    DOMString clientData;
};
Run Code Online (Sandbox Code Playgroud)

此数据包含应用程序需要使用的几个元素.

注册FIDO U2F注册响应消息的映射

  1. 生成的密钥对的公钥 - 您需要将其存储以供将来的身份验证使用.
  2. 生成的密钥对的密钥句柄 - 您还需要将其存储以备将来使用.
  3. 证书 - 您需要检查您是否信任此证书和CA.
  4. 签名 - 您需要检查签名是否有效(即确认与证书一起存储的密钥)以及签名的数据是否是预期的数据.

我已经为Java中的依赖方服务器准备了一个粗略的实现草案,该草案展示了如何最近提取和验证这些信息.


注册完成后,您以某种方式存储了生成的密钥的详细信息,您可以签署请求.

正如您所说,通过高级JavaScript API可以启动简短和甜蜜:

window.u2f.sign([{
    version : "U2F_V2",
    challenge : "c3RpbGwgYm9yZWQ/IQ",
    app_id : "http://example.org",
    sessionId : "42",
    keyHandle: "ZHVtbXlfa2V5X2hhbmRsZQ"
}], function (data) {

});
Run Code Online (Sandbox Code Playgroud)

在这里,您需要提供您在注册时获得的密钥句柄.再一次,在用户执行"用户存在测试"(例如,通过触摸令牌)之后,您将收到一个响应,这是一个JSON对象(再次参见规范了解更多详情)

dictionary SignResponse {
    DOMString keyHandle;
    DOMString signatureData;
    DOMString clientData;
};
Run Code Online (Sandbox Code Playgroud)

您需要验证此处包含的签名数据.

注册FIDO U2F认证响应消息的映射

  1. 您需要确保签名与之前获得的公钥匹配.
  2. 您还需要验证签名的字符串是否合适.

执行这些验证后,您可以考虑对用户进行身份验证.服务器端代码的简要示例实现也包含在我的服务器示例中.

  • 请注意,Chrome 要求 appId 为 https,如果使用 http,它将返回错误代码。在 https://github.com/google/u2f-ref-code#option-2-use-the-built-in-chrome-support 的 Chrome 参考代码中描述了解决方法 (2认同)

min*_*isu 22

我最近为此编写了说明,并在developers.yubico.com/U2F列出了所有U2F服务器库(其中大多数捆绑了一个完全正常工作的演示服务器).目标是使开发人员无需阅读规范即可实现/集成U2F.

免责声明:我在Yubico担任开发人员.

  • @Muis在FIDO术语中,_client_是与U2F设备通信的软件.如果这是你想要的,有[几个库](https://developers.yubico.com/Software_Projects/FIDO_U2F/U2F_Host_Libraries)可用.如果您正在寻找的是U2F设备的软件版本,请查看mritz_p的[virtual-u2f](https://github.com/mplatt/virtual-u2f),或者使用的软键类.我原来的答案中提到的服务器库的测试套件. (4认同)