如何使用两因素身份验证记住受信任的机器(如 Google 的系统)

信息安全 网络服务器 客户端
2021-09-03 09:35:25

我们正在开发一个将使用两因素身份验证的 Web 应用程序。我们可能会尝试模仿类似于 google 使用的东西,在登录的地方输入用户名和密码,然后在 SMS 消息中接收令牌以输入。

如果用户愿意,我们希望允许用户记住客户端计算机,以便他们可以登录 30 天而无需使用第二种身份验证方法。我们可以访问哪些信息(通过网页请求的标头等),我们可以使用这些信息来唯一地识别这个受信任的客户端机器?

显然,一个用户可以拥有多个受信任的客户端机器,我完全希望如果他们在同一台受信任的机器上使用两个不同的浏览器,每个浏览器都必须独立受信任。

在机器上设置一个带有一些 GUID 的 cookie,这意味着这是受信任的,这还不够好,因为其他人可以复制 cookie,并在他们自己的浏览器上创建它,从而绕过两因素身份验证。

3个回答

我不认为仅使用 JavaScript/PHP(或其他一些服务器端语言)来唯一地印记/识别计算机是完全可能的。

请记住,无论您做什么,有恶意的人都可以将 Chrome/Firefox 用户数据目录复制到类似的系统(相同的操作系统等)。事实上,这是最简单的事情,因为您不必寻找饼干。JavaScript 无法读取这些目录之外的任何内容,因此它们只是复制了系统。

但是,您可以使用 Flash/JavaScript 对浏览器进行指纹识别不幸的是,如果用户安装字体等,浏览器指纹可能会发生变化。此外,您的用户必须允许 Flash/JavaScript 运行——由于最近的 0 Day 漏洞,现在很多人正在禁用 JavaScript。您不想强迫您的用户必须使用这些。无论如何,可以通过复制系统轻松复制指纹(这需要时间,但并不难)。

最后,两因素身份验证都是关于(a)拥有密码和(b)对设备进行物理访问。如果您在以您身份登录时让某人在不受监督的情况下访问您的计算机,则 (b) 部分无论如何都会以不同的方式受到损害。


但是,要回答您的问题:

  • 您可以在 cookie 中放置一个唯一的 GUID
  • 您可以将另一个 GUID 放入 localStorage
  • 您可以将浏览器 User-Agent 请求标头的一部分与帐户相关联。例如,我的用户代理是User-Agent:Mozilla/5.0 (X11; Linux i686) AppleWebKit/536.11 (KHTML, like Gecko) Ubuntu/12.04 Chromium/20.0.1132.47 Chrome/20.0.1132.47 Safari/536.11. 从这里,您可以提取我的浏览器名称(不会更改)、操作系统名称和版本(偶尔会更改)、我的计算机是否为 32 位等。
  • navigator.plugins-- 这是浏览器上安装的所有插件的数组。不过,对于 2 因素身份验证而言,这可能不是一个好主意,因为这种情况经常发生变化。

请注意,所有这些都很容易被欺骗。对于潜在的黑客来说,这只是额外的障碍。

同样,您可以尝试使用处理读取已安装字体列表等的指纹技术。同样,这可以被规避,但要困难得多。您还可以使用 JavaScript 在计算机上的随机位置存储类似 cookie 的文件(不确定这是否是个好主意)

编辑:正如 Joel 在评论中提到的,您还应该有一种撤销“受信任的计算机”的方法(只需分离数据库中的 GUID)。这也适用于更改密码时。

不要以为仅使用标准 Web 浏览器的任意客户端就可以安全地完成此操作。正如您所说,cookie 不是授权计算机的安全选择。此外,cookie 是按浏览器设置的,而不是按计算机设置的。您可以尝试浏览器指纹识别技术,但这又是特定于浏览器的,而不是计算机。请记住,恶意客户端可以任意设置 HTTP 请求,包括用户代理字符串。

您还可以在发出 cookie 时加密 cookie 中的用户 IP 地址,然后将 cookie 中的 IP 地址与传入的 HTTP 请求中的 IP 地址进行比较。当然,当 ISP 更改消费者的动态 IP 地址时,这会中断,但这种情况不会经常发生。