CryptoJS 具有从消息和密钥创建 HMAC 的功能。
考虑到密钥必须以显而易见的方式存储在客户端上部署的 JavaScript 源代码中,这怎么能保证安全?
任何人都可以以 API 的原始客户端的身份获取密钥并向服务器发出类似的请求。“身份”不是HMAC应该解决的问题吗?
总而言之,我不明白 HMAC 在客户端 JS 中的用途,因为密钥不能保密。
有用 JavaScript 计算 HMAC 的用例吗?
CryptoJS 具有从消息和密钥创建 HMAC 的功能。
考虑到密钥必须以显而易见的方式存储在客户端上部署的 JavaScript 源代码中,这怎么能保证安全?
任何人都可以以 API 的原始客户端的身份获取密钥并向服务器发出类似的请求。“身份”不是HMAC应该解决的问题吗?
总而言之,我不明白 HMAC 在客户端 JS 中的用途,因为密钥不能保密。
有用 JavaScript 计算 HMAC 的用例吗?
JavaScript 现在有 WebRTC,两个客户端可以在其中进行点对点通信,这将是客户端可以生成和使用自己的“秘密”的场景。
在某些情况下,客户端 -> 服务器也可以使用。如果您的服务器“动态地”为 JavaScript 提供服务,那么它可以根据客户端当前会话/登录插入一个“秘密”。假设您使用的是 HTTPS(如果没有,中间可能有一个人在啜饮“秘密”),那么假设与使用该特定“秘密”(甚至通过不安全的 HTTP)签署的服务器的通信仅属于那个客户。
考虑到密钥必须以显而易见的方式存储在客户端上部署的 JavaScript 源代码中,这怎么能保证安全?
每个客户都应该得到他们自己的密钥/秘密,这使他们能够访问他们应该有权访问的资源。这实际上与用户知道自己的用户名和密码没有什么不同。他们的用户/通行证组合只允许访问他们需要的资源。密钥对也应该如此。
任何人都可以以 API 的原始客户端的身份获取密钥并向服务器发出类似的请求。“身份”不是HMAC应该解决的问题吗?
是的,当然,如果有人得到你的密钥和秘密,他们可以发出请求,就好像它们来自你一样。只是不要把你的秘密告诉别人。在 JavaScript 中使用它根本不重要。当然,用户可以看到它,但除非他们将那个密钥和秘密放在其他地方,否则这不是问题。
我有一个系统,用户通过正常方式(用户名/密码、OAuth、OpenID 等)登录,并立即获得用于进行 API 调用的密钥/秘密。客户端应用程序使用此密钥/秘密来实际完成其工作。此密钥/秘密的发布是通过 HTTPS 完成的。我想为我的 API 使用 HMAC,因为我希望用户能够预先签署要在公开场合使用的请求。这种方法使我能够为通常的管理 GUI 保留 HMAC。