我已经阅读了许多关于在 RESTful 客户端 (Javascript) 应用程序中使用 HMAC 和密钥进行客户端身份验证的文章。尽管如此,我仍然没有找到能够透明地向我解释填补理论安全漏洞的过程的单一来源。
密钥应该是秘密的,这意味着只有特定的客户端和服务器应该知道密钥。由于密钥不应通过网络传输,因此应通过电子邮件等安全介质发送。我不会使用 SSL/TLS,因此在登录时发送密钥作为来自服务器的响应不是一种选择。
当质疑安全性时,这对我来说毫无意义。用户为我的应用程序访问他的电子邮件的唯一原因是注册(激活帐户)。
- 我的第一个想法是 cookie 不安全,但是有没有另一种方法可以在客户端存储密钥?
- 当用户清除他的 cookie 时,密钥就会丢失。每次 cookie 消失时发送另一封带有新密钥的电子邮件并不合乎逻辑,这对用户来说没有任何意义。
- 用户将使用多个客户端,并且应该为每个客户端生成一个单独的密钥。设置注册键听起来不像一个选项。
对我来说唯一有意义的是客户端在用户登录时获得密钥,因为在用户注销时(或在某个到期时间之后)没有理由保留密钥。
所以这个问题很简单:
用户如何在登录时获取密钥,以及它存储在客户端的什么位置以便安全?
我感到有点惊讶,我似乎无法弄清楚这一点。同一个问题的很多答案似乎都在拐弯抹角,但从来没有达到让我理解的最佳点。
编辑:
经过一天的研究,我只能得出结论,确实需要 SSL 连接。我只是无法以其他方式看到它。
无论如何,秘密必须同时到达客户端和服务器。
如果这是真的,我不明白为什么我读过的这么多网站和博客都指向使用 HMAC 作为 Basic Auth + SSL 的替代方案。如果没有透明的方式在服务器和客户端@登录时共享密钥,那么对我来说,使用 HMAC 根本没有用。
我觉得这很遗憾,因为在 RESTful 环境中,发送到服务器的每个请求都需要单独进行身份验证。
我的应用程序应该为假设的大量人员向服务器发送大量请求,我担心 SSL 会导致开销。
如果我看错了,请纠正我。