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)
此数据包含应用程序需要使用的几个元素.

我已经为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)
您需要验证此处包含的签名数据.

执行这些验证后,您可以考虑对用户进行身份验证.服务器端代码的简要示例实现也包含在我的服务器示例中.
min*_*isu 22
我最近为此编写了说明,并在developers.yubico.com/U2F列出了所有U2F服务器库(其中大多数捆绑了一个完全正常工作的演示服务器).目标是使开发人员无需阅读规范即可实现/集成U2F.
免责声明:我在Yubico担任开发人员.
| 归档时间: |
|
| 查看次数: |
18578 次 |
| 最近记录: |