【问题标题】:Securing Private API keys in Javascript Web App在 Javascript Web App 中保护私有 API 密钥
【发布时间】:2014-09-27 13:17:08
【问题描述】:

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

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

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

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

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


可能的解决方案?

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

将公钥/私钥存储在网页本身中 - 我能想到的唯一真正的解决方案 - Javascript 可以通过 DOM 访问密钥,并且只有在用户让他们的帐户保持登录状态,并且有人知道在哪里可以找到他们。

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


不确定我是否在正确的轨道上(有些东西告诉我我不是),希望有人可以让我明白这一点。

谢谢

【问题讨论】:

    标签: javascript api security rest authentication


    【解决方案1】:

    问候,

    在前端应用中使用 API key 和 Token 总是有安全存储 key 或 token 的需求,遗憾的是浏览器(客户端)没有这样的存储。这种情况可以通过在身份验证后使用访问令牌(如果是 Oauth)而不是 API 密钥来克服,并且这些访问令牌也可以有自己的到期时间。

    如果确实需要针对客户端存储的密钥/令牌的额外安全性,在这种情况下,我们会想出一个解决方案,例如使用带有一些散列算法的 base64 类型的方法加密我们的令牌,并在其中解密和验证API 端点就是解决方案。

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

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

    【讨论】:

    • @v8-E,答案/解决方案作为声明给出,链接仅供参考,不作为答案。
    • base64 不是加密,使用任何散列算法时,令牌本身是不可恢复的。另外,请在您的答案中添加所有说明,而不是链接到外部资源
    【解决方案2】:

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

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

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

    并在请求标头中发送:

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

    在授权 api 请求时,需要检查“session_token”标头并验证其真实性。如果 session_token 不存在,它将回退到 HMAC 检查。

    加上 ssl 就够了,有什么想法吗?

    【讨论】:

      【解决方案3】:

      完全不确定是否有明确的解决方案。听起来您正试图在浏览器中存储“秘密”?即使您尝试对其进行混淆,也有办法查看它。

      【讨论】:

      • 我想是的。我开始认为用户以某种方式发现自己的密钥的想法并不那么危险。但是在哪里存储密钥以便授权用户以外的任何人都无法看到它们的问题仍然是相关的。
      • @thomasfw 您可以尽最大努力保证将机密安全地传送到目标(即浏览器)。一旦他们在那里,所有的赌注都被取消了,因为这完全取决于客户如何保护他的机器。如果机器感染了恶意软件,那你就完蛋了。
      • @deceze 你有什么建议?如何将公钥存储在 cookie 中,将私钥存储在文档中的某个位置(类似于如何在表单中生成 nonce)..
        。我不敢相信那里没有针对此的程序,Facebook 如何验证对其 API 的现场请求?
      • @thomasfw 据我所知,公钥/私钥并未在浏览器中广泛使用。 Facebook 等人通常使用临时令牌;即良好的旧会话ID。至少这些可以通过一些额外的健全性检查(IP、运行计数器、浏览器标头)在某种程度上与客户端相关联,并且可以被撤销。
      • @deceze 所以也许解决方案是为我的 API 设置两个授权程序 - 这样我可以从移动/编译的应用程序发送 HMAC 签名请求,或者绕过此程序并确认请求,如果标头中收到了有效的令牌?大概还使用 ssl/tls 来加密连接会在某种程度上防止令牌被泄露?
      猜你喜欢
      • 2016-03-04
      • 1970-01-01
      • 2018-07-17
      • 1970-01-01
      • 2016-05-12
      • 2016-10-10
      • 1970-01-01
      • 2023-03-02
      • 1970-01-01
      相关资源
      最近更新 更多