【问题标题】:HMAC in client side JavaScript and identity spoofing客户端 JavaScript 中的 HMAC 和身份欺骗
【发布时间】:2013-08-08 22:36:01
【问题描述】:

CryptoJS 具有从消息和密钥创建 HMAC 的功能。

考虑到密钥必须以显而易见的方式存储在客户端上部署的 JavaScript 源中,这如何保证安全?

任何人都可以获取密钥并以 API 原始客户端的身份向服务器发出类似的请求。 “身份”不是HMAC应该解决的问题吗?

总而言之,我不明白 HMAC 在客户端 JS 中的用途,因为密钥不能保密。

有用 JavaScript 计算 HMAC 的用例吗?

【问题讨论】:

    标签: javascript hmac cryptojs


    【解决方案1】:

    考虑到密钥必须以显而易见的方式存储在客户端上部署的 JavaScript 源中,这如何保证安全?

    每个客户端都应该有自己的密钥/秘密,这使他们能够访问他们应该有权访问的资源。这实际上与用户知道自己的用户名和密码没有什么不同。他们的用户/通行证组合只允许访问他们需要的资源。密钥对也应如此。

    任何人都可以获取密钥并以 API 原始客户端的身份向服务器发出类似的请求。 “身份”不是HMAC应该解决的问题吗?

    是的,当然,如果有人获得了您的密钥和秘密,他们可以发出请求,就好像它们来自您一样。只是不要把你的秘密告诉别人。在 JavaScript 中使用它根本不重要。当然,用户可以看到它,但除非他们将那个密钥和秘密放在其他地方,否则这不是问题。

    我有一个系统,其中用户通过正常方式(用户名/密码、OAuth、OpenID 等)登录并立即获得用于进行 API 调用的密钥/秘密。客户端应用程序使用此密钥/秘密来实际完成其工作。此密钥/秘密的发布是通过 HTTPS 完成的。我想为我的 API 使用 HMAC,因为我希望用户能够预先签署要在公开场合使用的请求。这种方法使我能够为通常的管理 GUI 保留 HMAC。

    【讨论】:

      【解决方案2】:

      JavaScript 现在有 WebRTC,两个客户端可以在其中进行点对点通信,这将是客户端可以生成和使用自己的“秘密”的场景。

      在某些情况下客户端 -> 服务器也可以使用。如果您的服务器“动态”地为 JavaScript 提供服务,那么它可以根据客户端当前会话/登录插入一个“秘密”。假设您使用的是 HTTPS(如果没有,中间可能有一个人在啜饮“秘密”),那么假设与使用该特定“秘密”(甚至通过不安全的 HTTP)签署的服务器的通信仅属于那个客户。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-04-27
        • 2021-09-18
        • 1970-01-01
        • 1970-01-01
        • 2017-10-09
        • 2023-03-15
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多