鉴于最近围绕FIDO U2F规范的所有讨论,我想在测试平台上以测试方式实现FIDO U2F,以为即将推出的最终规范做好准备。

到目前为止,我已经拥有由Yubico生产的FIDO U2F安全密钥和安装在Chrome中的FIDO U2F(通用第二因子)扩展程序。我还设法设置了安全密钥以用于我的Google登录。

现在,我不确定如何在自己的网站上使用这些东西。我浏览了Google在Github上的U2F项目页面,并检查了它们的web app front-end。它看起来非常简单(仅JavaScript)。
那么,用FIDO实现二次身份验证是否像实现一些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;
      });

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

最佳答案

您正在尝试实现一个所谓的“依赖方”,这意味着您的Web服务将依赖于FIDO U2F token 提供的身份声明。

您将需要了解U2F specifications来做到这一点。尤其是如何实现挑战响应范式以及应用程序ID和方面如何工作。这在规范中有详细描述。

没错:从应用程序的前端使用FIDO U2F所需的实际代码几乎是微不足道的(也就是说,如果您使用的是“高级” JavaScript API,而不是“低级” MessagePort API) 。但是,您的应用程序将需要使用 token 生成的消息并对其进行验证。这不是小事。

为了说明如何实现依赖方站点,我将给出一些代码示例,这些示例取自我出于学术原因最近编写的Virtual FIDO U2F Token Extension。您可以在页面上找到完整的示例代码。

在您的用户可以使用其FIDO U2F token 进行身份验证之前,他们需要先向您注册
为了允许他们这样做,您需要在他们的浏览器中调用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) {

});

用户执行“用户存在性测试”(例如通过触摸 token )后,您将收到一个响应,该响应是JSON对象(有关更多详细信息,请参见规范)

dictionary RegisterResponse {
    DOMString registrationData;
    DOMString clientData;
};

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

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

  • 我已经为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) {
    
    });
    

    在这里,您需要提供在注册过程中获得的密钥句柄。
    在用户执行“用户存在性测试”(例如,通过触摸 token )之后,您将再次收到响应,它是一个JSON对象(同样,请参见规范以获取更多详细信息)

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

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

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

  • 一旦执行了这些验证,就可以认为用户已通过身份验证。我的server example也包含服务器端代码的简短示例实现。

    关于google-chrome - 如何使用FIDO U2F允许用户向我的网站进行身份验证?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26637660/

    10-12 14:05