2014-10-29 71 views
26

与各地FIDO U2F规范的所有最近的嗡嗡声,我想实现FIDO U2F测试明智的一个测试平台,以准备为即将推出的最终规格。如何使用FIDO U2F允许用户通过我的网站进行身份验证?

到目前为止,我有Yubico和FIDO U2F(通用第二要素)扩展安装在Chrome中产生的FIDO U2F安全密钥。我还设法设置了安全密钥以与我的Google登录一起工作。现在

,我不知道如何使用这个东西对我自己的网站。我已经通过Google的Github页面查看了U2F项目,并且已经检查了他们的web app front-end。它看起来非常简单(仅限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;    
     }); 

但我怎么能使用一个实现自己?我能否使用此方法调用中的回调进行用户注册?

回答

41

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

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

您是对的:从您的应用程序的前端使用FIDO U2F所需的实际代码几乎是微不足道的(也就是说,如果您使用“高级”JavaScript API而不是“低级别“MessagePort API)。然而,您的应用程序需要使用令牌生成的消息并验证它们。这不是微不足道的。

为了说明如何实现依赖方网站,我将举几个代码示例,这些代码示例取自我最近因学术原因编程的Virtual FIDO U2F Token Extension。您可以看到完整示例代码的页面。


之前,用户可以使用自己的FIDO U2F令牌进行身份验证,他们需要寄存器它与你。 为了让他们这样做,您需要在浏览器中拨打window.u2f.register。要做到这一点,你需要提供一些参数(再次阅读规范的细节)。 其中一个挑战和您的应用程序的ID。对于Web应用程序,此ID必须是触发FIDO操作的网页的Web源。让我们假设它是example.org

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

}); 

一旦用户执行“用户存在测试”(例如,通过接触令牌),您将收到一个回应,这是一个JSON对象(详见规范)

dictionary RegisterResponse { 
    DOMString registrationData; 
    DOMString clientData; 
}; 

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

Register Map of a FIDO U2F Registration Response Message

  1. 生成的密钥对的公共密钥 - 您需要存储这为将来的认证使用。
  2. 生成的密钥对的关键句柄 - 您还需要将其存储以供将来使用。
  3. 证书 - 您需要检查您是否信任此证书和CA.
  4. 签名 - 您需要检查签名是否有效(即确认存储在证书中的密钥)以及签署的数据是否为预期的数据。

我已经为Java中的依赖方服务器编写了一个rough implementation draft,它显示了最近如何提取和验证这些信息。


一旦注册完成后,你有莫名其妙存储生成的密钥的详细信息,可以迹象请求。

正如你所说,这可以引发短暂的甜蜜通过高层次的JavaScript API:

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

}); 

在这里,你需要提供钥匙手柄,你已经注册期间获得。 再次,用户执行“用户存在测试”(例如,通过接触令牌)后,您会收到一个回应,这是一个JSON对象(同样,见规格表了解详细信息)

dictionary SignResponse { 
    DOMString keyHandle; 
    DOMString signatureData; 
    DOMString clientData; 
}; 

你需要验证此处包含的签名数据。

Register Map of a FIDO U2F Authentication Response Message

  1. 你需要确保在签名前,你已经获得了公共密钥相匹配。
  2. 您还需要验证签名的字符串是否合适。

一旦您执行了这些验证,您可以考虑用户验证。服务器端代码的简单示例实现也包含在我的server example中。

+0

请注意,Chrome需要appId为https,如果使用http,它将返回错误代码。 https://github.com/google/u2f-ref-code#option-2-use-the-built-in-chrome-support – 2016-08-20 15:14:15

15

我最近写的这个说明,以及listing all U2F server libraries(其中大部分捆绑了完全工作演示服务器),在developers.yubico.com/U2F。目标是使开发人员无需阅读规范即可实现/集成U2F。

声明:我是Yubico的开发人员。

+1

中的Chrome参考代码中描述了一些解决方法您是否知道是否存在任何客户端-libraries?例如,创建一个Yubico Fido仿真器。 – Muis 2014-12-02 18:54:38

+3

@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),或使用的软键类在我原来的答案中提到的服务器库的测试套件中。 – minisu 2014-12-03 07:00:58

相关问题