【发布时间】:2011-11-17 22:54:03
【问题描述】:
这里的一些人正在开发一个应用程序,其中包含一些可通过登录访问的“安全区域”。过去,登录表单和随后的“安全”页面都是通过 http 传输的纯文本,因为它是一个应用程序用于几乎不可能使用 SSL 的共享服务器(想想 WordPress 等)。大多数人只是耸了耸肩,这就是他们所期望的——这几乎不是一家国家银行。
我们现在正在考虑使用 JavaScript 前端编写下一个版本,其优点是一次加载所有图像和 CSS,然后使用 extJS(或者可能是 jQuery)将 HTML 写入 DOM。我们希望在发送到服务器之前在客户端加密用户输入,然后在呈现为 HTML 之前在浏览器中解密服务器输出,以便为用户引入某种安全性。减少页面加载时间也有好处,因为我们只来回发送 gzip 压缩的 JSON。
在玩的过程中,我们意识到我们正在研究的加密基本内容的方法首先也可以作为登录的身份验证机制。
为简单起见...:
- 用户通过标准 http 连接到登录页面,浏览器在该页面下载包含散列和加密算法(例如 SHA-256 和 AES)的 JavaScript 包。
- 用户在登录表单中输入
username、password和secret。 - 浏览器 JavaScript 通过 AJAX 向服务器发送
username和password的哈希值。secret仅存储在 JavaScript 中,从不通过 Internet 发送。 - 服务器查找哈希并从数据库中检索
username和secret。 - 服务器将
username和secret的哈希(与浏览器相同的算法)发送回浏览器。 - 浏览器 JavaScript 创建
username和secret的哈希值,并将其与服务器发回的哈希值进行比较。 - 如果它们相同,浏览器 JavaScript 会使用
secret加密response并将消息发送回服务器。 - 服务器使用
secret解密消息以找到预期的response并开始一个新会话。 - 随后的通信使用
secret双向加密和解密。
这种类型的系统似乎有一些优点,但我们的想法是否正确:
- 如果服务器设法创建了
username和secret的哈希,则用户知道他们正在与他们的服务器通信,证明服务器知道并理解username和secret。 - 如果用户设法用
secret加密response,服务器就知道用户是真实的,证明用户知道secret。 -
secret绝不会以纯文本形式传输,或者是否可以从哈希中确定secret。 - 嗅探器只会找出“安全”URL 并检测查询字符串中的压缩散列和加密。如果他们向格式错误的 URL 发送请求,则不会给出响应。如果他们设法猜到了一个适当的请求,他们仍然必须能够解密它。
这一切似乎都足够快,以至于用户无法察觉。任何人都可以看穿这一点,因为我们都认为我们不应该玩 JavaScript 加密!
【问题讨论】:
-
如果您要保护的内容(即需要某种安全措施的信息)具有任何价值,那么您应该使用由安全专家设计和测试的安全协议。句号。任何其他做法都是鲁莽的。
-
谢谢@pointy,尽管您是建议全世界所有的 WordPress 用户都应该切换到 SSL 吗?
-
这取决于您要保护的信息的性质。如果它真的很有价值(个人信息、财务、健康相关等等),那么它应该受到真正的协议的保护。如果没有其他原因,请考虑潜在的责任......
-
我见过很多“被黑”的 WordPress 网站,悲伤的用户抱怨他们丢失了所有帖子。除非应用程序代码需要像 SSL/TLS 这样的安全传输层,否则您认为开发人员应该停止推此类产品吗?
-
好吧,也许这样想会更好:您会信任某个承诺某种安全性但不使用 HTTPS 的随机站点吗?我不会,至少不会有任何我认为敏感的信息。
标签: javascript authentication encryption-asymmetric encryption