我不认为仅使用 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)。这也适用于更改密码时。