【问题标题】:Offline Authentication with GWT使用 GWT 进行离线身份验证
【发布时间】:2015-01-12 17:30:14
【问题描述】:
我遇到了this 在线文档,从那里看到了关于 GWT 离线身份验证的幻灯片:
在线时,身份验证由服务器完成。
问题是:
- 真的可以使用这种方法安全地验证 GWT 应用程序吗?如果它是 SHA-3 编码的,它真的会安全吗?
- 当用户在浏览器中获得身份验证时,用户使用离线应用程序,比如保存内容,然后肯定它只是存储在 HTML5 存储中,但是用户信息可能嵌入在任何保存的内容中。因此,当应用重新上线时,它将同步到服务器。这如何安全?服务器会接受它正在同步的东西确实来自正确的用户吗?
【问题讨论】:
标签:
java
html
authentication
gwt
【解决方案1】:
关于身份验证,离线没有特殊情况。它的工作原理与在线相同。
您通常会在您的客户端浏览器中存储一个包含会话信息的 Cookie,该 Cookie 用于向服务器验证客户端(当您发出请求时)。
只要会话信息在后端持久存在,您就可以重新对用户进行身份验证。
您不得将密码存储在客户端。它足以在客户端上存储一些会话信息(在 Cookie 或 LocalStorage 中)并使用它来验证用户。
【解决方案2】:
实际上,您在浏览器中存储的不是密码本身,而是它的 SHA-3 哈希值。
从密码学的角度来看,这种方法非常安全,因为要找回原始密码并不容易。
请注意:
您的代码将存储在客户端,并且客户端上的每个源代码都可以被篡改。因此,恶意用户也可能能够阅读和利用它。
不过不用担心,对于离线可用应用程序的普通用例来说,这已经足够安全了。
我会为长时间运行的服务器会话做什么:
在服务器端生成一个随机 ID,将其与用户相关联并将其存储在数据库中。
将 ID 设置为客户端上的 cookie,并在用户未登录且 cookie 中仍有此 ID 时重新验证用户。
要限制时间量,您可以在服务器端添加超时值,然后丢弃 ID。
【讨论】:
-
-
您可以使用盐来防止对哈希本身的rainbow table 攻击。在这种情况下,您会将盐值存储在服务器上并使用它来生成这样的散列:将盐附加到密码并散列它。我通常做的是将用户名附加到哈希中。因此,即使是使用相同密码的两个用户也会得到不同的哈希值。