将机密数据安全地存储在客户端Web应用程序中


11

我有这个Web应用程序,它将成为所有客户端技术(HTML,CSS,JavaScript / AngularJS等)。该Web应用程序将与REST API进行交互,以访问和修改数据。目前,尚不确定REST API将使用哪种类型的身份验证系统。

据我了解,任何类型的API身份验证系统(API密钥,OAuth 1/2等)都将具有某些需要保密的数据,否则可能会损害访问权限。对于API密钥,它们本身的密钥需要保密,对于OAuth 2,客户端秘密/访问令牌/刷新令牌需要保密,我确定OAuth 1涉及的4个密钥中的一些必须保密(不是OAuth 1的经验过多)。我一直在尝试思考是否有一种方法可以将这种秘密内容存储在纯客户端Web应用程序中,而无需在服务器端进行中间层排序。

我一直在尝试考虑这个问题,而我想不起任何地方可以这样做。我的意思是我无法将其存储在javascript中,因为任何人都只能查看源代码或打开控制台并获取数据。我不确定100%localStorage的安全性以及用户是否可以访问/修改该数据。即使本地存储是安全的,我想到的将数据放入其中的两种方法也不是。一种方法是仅将数据存储在javascript源代码中,这是我能想到的最不安全的事情。现在,如果我使用的是OAuth 2之类的东西,其余的api本身会给我令牌,那仍然不是那么安全(比第一个选项好),因为这些令牌将以纯文本形式返回,任何人都可以看到计算机正在查看的请求。

有没有办法让完全运行客户端的应用程序能够安全地存储秘密数据,而无需在服务器端设置某种中间层?



本地存储是特定于浏览器的,但是以Windows上的Opera为例,它只是用户配置文件文件夹中的一些磁盘文件,因此基本上不受保护。
Ross Patterson

一种方法是将机密信息保留在数据库中的服务器上,而在客户端上仅具有application_id。然后从服务器执行oauth查询,因此这是某种代理方法。
Simon Polak 2014年

Answers:


9

不,它永远不可能完全安全。用户可以控制硬件,而您正试图避免某些事情发生。最终,他们可以通过一种或另一种方式来获得它。由于您使用的是JavaScript,因此您的位置比普通的计算机应用程序差很多,因为用户不仅可以控制硬件,还可以控制运行中的沙箱。

您可以隐藏事物,并使其难以入迷,但最终,只要他们努力尝试,他们便可以将其释放出来。


4
^这个。机密数据有多“机密”?有多少时间和金钱在保护它实际价值?“行业标准”的努力可能就足够了。
DaveE

+1出色的答案。使用JavaScript调试器,我可以更改您的应用程序,查看中间值等。 如果需要这些信息,则可以获取。
罗斯·帕特森

2

在设计安全系统时,总是需要考虑威胁模型。“ 确保安全 ”是一个愚蠢的要求,不可操作或无法验证。“ 防止用户从应用程序中提取访问令牌 ”更好,并且定义了解决方案的边界。“ 阻止他人获取用户的访问令牌 ”也更好,并且定义了完全不同的解决方案空间。一个解决方案不一定解决另一个问题(例如,如果涉及WiFi,则后者绝对需要SSL,但这根本不会影响前者)。


0

REST API的一种选择是基于用户登录授予或不授予访问权限;它可以返回基于会话的令牌(guid,哈希字符串,随便您喜欢什么),可以将其传递给其他REST API调用以验证访问权限

如果您担心将用户登录信息存储在客户端计算机上,则不必这样做,但是用户每次都必须输入帐户和密码信息

不太熟悉OAuth等人,但是我看不到上面有任何令人信服的理由来永久存储身份验证信息...


由于种种原因,总有“安慰”,这显然是“安全”和“安全”的宿敌。
henon
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.