想象一下,您有一个 Web 应用程序,它在服务器和客户端上都对用户的数据(例如便笺或电子表格)进行加密。
用户使用这个 Web 应用程序的正常过程是这样的:
- 用户使用存储在服务器上的登录名/密码哈希登录应用程序。(就像普通的 Web 应用程序一样。)
- 用户输入用于加密客户端数据的附加安全密钥。Web 应用程序使用客户端加密库,例如SJCL
在这个例子中,让我们只关注客户端。
情况是这样的:服务器已经被攻破,攻击者访问了服务器端的密钥。攻击者没有客户端密钥,因为它们从未存储在服务器上。
现在,当用户在 Web 应用程序(客户端)中输入客户端密钥时,攻击者需要修改 Javascript 以读取客户端密钥。Javascript 将被编程为将密钥发送给攻击者/服务器。现在攻击者赢了。
我知道假设一旦你接管服务器,你就输了,但我想知道我下面的想法是否允许客户端安全解决方案。
情况
假设 HTML 在一些脚本标签中包含一些 Javascript 代码,并且还有许多通过驻留在服务器上的外部 Javascript 文件加载的 Javascript 代码。问题在于运行 Web 应用程序的 Javascript。我们必须假设攻击者修改了任何 Javascript,无论是内联的还是外部的。
可能的解决方案?
我希望能够生成从我的服务器加载的所有 Javascript 的哈希值。has 将充当客户端 Javascript 代码的指纹,用户将对新的哈希保持警惕。
到目前为止,这是我想到的两种方法:
获取加载到客户端的所有文件的哈希值。这意味着再次请求所有包含的文件。
对内存中的所有 Javascript 代码进行哈希处理。(这甚至可以做到吗?)
这两个选项的共同问题是,无论实际执行此哈希的函数是什么,它都需要足够小,以便相关用户可以在几秒钟内验证它是否可以安全使用。
我在想这个散列函数像往常一样加载到浏览器中,用户可以从控制台输入函数名称而不用,()
这样他们就可以看到代码,然后再次输入 with()
来运行代码。
然后哈希应该足以证明 Web 应用程序处于用户知道他们过去检查过的状态。
这甚至可能在某个时候成为一个插件,尽管我决心看看是否有可能使用原生解决方案。
本质上我要问的是,存在哪些方法可以让我们证明客户状态的完整性?