2

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

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

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

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

有用 JavaScript 计算 HMAC 的用例吗?

4

2 回答 2

4

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

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

于 2013-08-07T13:57:54.703 回答
1

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

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

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

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

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

于 2015-05-31T17:41:09.243 回答