在Javascript Web App中保护私有API密钥

时间:2014-08-04 23:56:59

标签: javascript api security rest authentication

如何在基于Web的(javascript)应用程序中将密钥安全地存储到我的私有API中?

我已对此进行了彻底的研究,但尚未找到可靠的答案或任何标准程序。

我的API实现了HMAC身份验证,我网站的每个成员都有一个公钥/密钥来验证他们对API的使用并签署​​他们的请求。

在移动应用程序上,服务器将通过加密连接发送公钥/密钥,以便在成功登录请求后存储在设备上。后续请求将使用这些密钥签名。

那么在这种情况下我应该将密钥存储在客户端上,考虑到知道如何使用Web检查器的任何人都可以看到源代码?实际上,如果经过身份验证的用户看到自己的密钥,则不会出现问题,因为他们不太可能分享这些密钥,就像他们不太可能与其他任何人分享他们的帐户用户名/密码一样。


可能的解决方案?

将公钥/密钥存储在Cookie中,并使用javascript检索 - 可能不太安全,当用户注销/会话结束时,Cookie是否可以被可靠地清除?

将公钥/密钥存储在网页本身 - 只有我能想到的真正解决方案--Javascript可以通过DOM访问密钥,只有在以下情况下才能访问密钥(如果看到)用户离开了他们的帐户,有人知道在哪里寻找他们。

注意: Web应用程序不是单页应用程序,因此将公钥/密钥存储在内存中不是一种选择。


不确定我是否在正确的轨道上(某些事情告诉我,我不是),希望有人可以让我直截了当。

由于

3 个答案:

答案 0 :(得分:1)

我得出的结论是,我在这里试图保护的是CSRF ..

我正在使用laravel,所以我的解决方案是在头部as seen here中添加csrf nonce(Session :: token())。

<meta name="token" content="32947fh2834fgkhgfr8724234f">

并在请求标头中发送它:

$.ajaxSetup({
    headers: { 'session_token': '32947fh2834fgkhgfr8724234f' }
});

在授权api请求时,检查&#39; session_token&#39;标题并验证它的真实性。如果session_token不在那里,它将回退到HMAC检查。

再加上ssl这应该够了,思考?

答案 1 :(得分:0)

根本不确定是否有明确的解决方案。听起来你正试图存储一个秘密&#34;在浏览器中?即使您试图对其进行模糊处理,也无法查看它。

答案 2 :(得分:0)

问候,

始终需要在前端应用程序上使用API​​密钥和令牌来安全地存储密钥或令牌,但不幸的是,浏览器(客户端)没有这种存储。可以通过在身份验证后使用访问令牌(如果使用Oauth)代替API密钥来克服这种情况,并且这些访问令牌也可以有自己的到期时间。

如果确实需要针对客户端中存储的密钥/令牌的附加安全性,那么在这种情况下,我们会想出一个解决方案,例如使用base64类方法和某种哈希算法对令牌进行加密,并在其中解密和验证API端点就是解决方案。

在这种情况下,以下博客文章可能会有所帮助:

https://www.wolfe.id.au/2012/10/20/what-is-hmac-authentication-and-why-is-it-useful/