security - GWT/Javascript客户端密码加密

标签 security gwt encryption authorization client-side

我正在我的 gwt 应用程序中实现授权,目前按以下方式完成:

  1. 用户通过将其凭据放入表单中进行注册,然后我将其以明文形式发送到服务器。
  2. 服务器代码使用 BCrypt 对收到的密码进行哈希处理,并将哈希值放入数据库中。
  3. 当用户登录时,他的密码会以明文形式发送到服务器,服务器会根据存储的哈希值对其进行检查。
现在。令我困扰的是,我正在将密码以明文形式发送到服务器,我一直在想,如果我正在使用的应用程序用我的(用于-一切类型)密码,但在客户端对其进行加密并不能真正为我带来任何好处,因为攻击者可以像使用明文密码一样使用散列密码。

我曾经googling一整天都在为此,而且似乎互联网在谈到这一点时非常一致 - 显然从客户端密码加密中没有任何好处。 This , thisthis这只是我访问过的讨论和页面的几个例子,但还有很多很多,都在说同样的事情。

鉴于这一切,这个问题似乎有点不必要,但我希望某个地方、某个人能给我另一个答案。

如果此时 ssl 不是一个选项,我该怎么做才能让我放心?有什么要做的,或者实现某种客户端加密服务器解密方案只是耗时的、无力的死马踢?

最佳答案

对于登录,即使在此时,SSL 也应该是您的选择。如果只是为了登录,则不需要昂贵的 SSL 场,但至少可以保护(用于所有类型的)密码,即使很明显,剩余的通信不安全[ *]。这可能意味着您只需要为一个登录服务器购买一个证书,这可以再次为您节省很多钱,具体取决于证书供应商。

对于 GWT,如果您无法加密所有通信,则由于同源策略限制,您必须将登录名放在单独的页面上。

如果这仍然不是一个选择,您可以考虑通过 OpenID 登录,就像 stackoverflow 一样。

如果没有一些预共享 secret ,就不可能在不安全的媒体上进行任何安全通信 - 通常由安装在浏览器中的根证书提供(顺便说一句,有趣/可怕的是浏览器甚至整个操作系统通常都是通过 HTTP 下载的)。其他系统,例如PGP,依赖于先前建立的信任"Web Of Trust" ,但这只是预共享 secret 的另一种形式。没有办法解决这个问题。

[*] 不幸的是,使用 SSL 进行所有操作会带来其他实际问题:1) 页面加载速度要慢很多,尤其是当页面上有很多元素时。这是由于 SSL 引起的往返和由此产生的延迟造成的,即使是最快的 SSL 场也无法应对。保持事件连接可以缓解该问题,但并不能完全消除该问题。 2) 如果您的页面包含来自国外非 HTTPS 站点的元素(例如用户插入的图像),许多浏览器将显示警告 - 这些警告对于真正的安全问题非常模糊,因此对于安全站点来说通常是 Not Acceptable 。

一些额外的想法(不是建议)

让我们暂时假设最坏的情况,即您根本无法使用 SSL。在这种情况下,也许令人惊讶的是,在传输密码之前对密码进行散列(用盐)实际上可能比什么都不做要好一些。原因是这样的:它无法击败Mallory(在密码学中,一个可以操纵通信的人),但至少它不会让Eve(一个只能听的人)读取明文密码。如果我们假设 Eves 比 Mallorys 更常见,这可能是有值(value)的(?)但请注意,在这种情况下,您应该在比较之前再次对密码进行哈希处理(使用不同的盐)与数据库值。

关于security - GWT/Javascript客户端密码加密,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3570623/

相关文章:

security - 为什么 AWS API Gateway 不支持 VPC?

java - 客户端使用java解密

Java:Javax Cipher 类中默认设置哪种模式?

encryption - 自定义加密/解密程序中的错误

javascript - 在 JavaScript 中使用 CryptoJS 和 AES 加密的 AES 加密的不同输出

.net - 如何防止其他人使用我的 .Net 程序集?

PHP: allow_url_include

python - 被一些机器人攻击

java - 使用 UiBinder 构建的 GWT 应用程序的本地化在托管模式下不起作用

java - GWT TreeItem(String) 构造函数