【问题标题】:Javascript asymmetric encryption and authenticationJavascript非对称加密和身份验证
【发布时间】:2011-11-17 22:54:03
【问题描述】:

这里的一些人正在开发一个应用程序,其中包含一些可通过登录访问的“安全区域”。过去,登录表单和随后的“安全”页面都是通过 http 传输的纯文本,因为它是一个应用程序用于几乎不可能使用 SSL 的共享服务器(想想 WordPress 等)。大多数人只是耸了耸肩,这就是他们所期望的——这几乎不是一家国家银行。

我们现在正在考虑使用 JavaScript 前端编写下一个版本,其优点是一次加载所有图像和 CSS,然后使用 extJS(或者可能是 jQuery)将 HTML 写入 DOM。我们希望在发送到服务器之前在客户端加密用户输入,然后在呈现为 HTML 之前在浏览器中解密服务器输出,以便为用户引入某种安全性。减少页面加载时间也有好处,因为我们只来回发送 gzip 压缩的 JSON。

在玩的过程中,我们意识到我们正在研究的加密基本内容的方法首先也可以作为登录的身份验证机制。

为简单起见...:

  • 用户通过标准 http 连接到登录页面,浏览器在该页面下载包含散列和加密算法(例如 SHA-256 和 AES)的 JavaScript 包。
  • 用户在登录表单中输入usernamepasswordsecret
  • 浏览器 JavaScript 通过 AJAX 向服务器发送 usernamepassword 的哈希值。 secret 仅存储在 JavaScript 中,从不通过 Internet 发送。
  • 服务器查找哈希并从数据库中检索usernamesecret
  • 服务器将usernamesecret 的哈希(与浏览器相同的算法)发送回浏览器。
  • 浏览器 JavaScript 创建 usernamesecret 的哈希值,并将其与服务器发回的哈希值进行比较。
  • 如果它们相同,浏览器 JavaScript 会使用 secret 加密 response 并将消息发送回服务器。
  • 服务器使用secret 解密消息以找到预期的response 并开始一个新会话。
  • 随后的通信使用secret 双向加密和解密。

这种类型的系统似乎有一些优点,但我们的想法是否正确:

  • 如果服务器设法创建了usernamesecret 的哈希,则用户知道他们正在与他们的服务器通信,证明服务器知道并理解usernamesecret
  • 如果用户设法用secret 加密response,服务器就知道用户是真实的,证明用户知道secret
  • secret 绝不会以纯文本形式传输,或者是否可以从哈希中确定 secret
  • 嗅探器只会找出“安全”URL 并检测查询字符串中的压缩散列和加密。如果他们向格式错误的 URL 发送请求,则不会给出响应。如果他们设法猜到了一个适当的请求,他们仍然必须能够解密它。

这一切似乎都足够快,以至于用户无法察觉。任何人都可以看穿这一点,因为我们都认为我们不应该玩 JavaScript 加密!

【问题讨论】:

  • 如果您要保护的内容(即需要某种安全措施的信息)具有任何价值,那么您应该使用由安全专家设计和测试的安全协议。句号。任何其他做法都是鲁莽的。
  • 谢谢@pointy,尽管您是建议全世界所有的 WordPress 用户都应该切换到 SSL 吗?
  • 这取决于您要保护的信息的性质。如果它真的很有价值(个人信息、财务、健康相关等等),那么它应该受到真正的协议的保护。如果没有其他原因,请考虑潜在的责任......
  • 我见过很多“被黑”的 WordPress 网站,悲伤的用户抱怨他们丢失了所有帖子。除非应用程序代码需要像 SSL/TLS 这样的安全传输层,否则您认为开发人员应该停止推此类产品吗?
  • 好吧,也许这样想会更好:会信任某个承诺某种安全性但不使用 HTTPS 的随机站点吗?我不会,至少不会有任何我认为敏感的信息。

标签: javascript authentication encryption-asymmetric encryption


【解决方案1】:

不要这样做。请使用 SSL/TLS。见Javascript Cryptography Considered Harmful

【讨论】:

  • +1 为您的链接,但您能否告诉我们您认为我上面描述的方法在哪一点失败?
  • 我认为它在第 1 步失败。由于您的连接不安全,攻击者可以在您的加密代码之前注入 <script> 标签并窃取机密。
  • 标记为已回答 - 办公室内的共识是,如果我们可以不厌其烦地编写一个不起眼的加密库来阻止人们“嗅探”,那么一些有进取心的攻击者肯定会不厌其烦地拦截初始浏览器-服务器通信以插入自己的脚本。在那之后密码就不再重要了!
  • 可以通过 SSL/TLS 进行身份验证。但是,如果用户知道如何使用 curl、open-ssl 等工具并获得“经过身份验证的 ssl 会话”,然后他会执行恶意操作,例如发布错误的 JSON 数据(在线零售应用程序、银行应用程序等)。所以授权是有问题的。除了某种 AES 以及在浏览器中完成的加密之外,我没有看到任何其他解决方案。
  • 这里唯一有害的是不回答问题,不总结链接等。实际上JS有很多用途。
【解决方案2】:

如果您可以提供单个 SSL 站点来安全地传递您的 JavaScript(以避免上述攻击),那么您可以使用开源 Forge 库在生成自签名证书后为您的其他站点提供跨域 TLS 连接为他们。如果您选择不同的方向,Forge 库还提供其他基本的加密内容。 Forge 有一个几乎所有 JavaScript 的 XMLHttpRequest 包装器,其中有一小部分利用 Flash 的套接字 API 来实现跨域通信。

http://digitalbazaar.com/2010/07/20/javascript-tls-1/

https://github.com/digitalbazaar/forge

【讨论】:

  • 如果有人创建了这样的网站...不过,如果代码没有正确锁定,它可能会被 XSS 污染...
猜你喜欢
  • 2011-11-09
  • 1970-01-01
  • 1970-01-01
  • 2014-05-30
  • 2012-03-30
  • 1970-01-01
  • 2016-04-11
  • 2015-04-29
  • 2013-03-03
相关资源
最近更新 更多