4

我目前正在尝试修改现有的 GWT-Ext 应用程序,该应用程序在其 MySql 数据库中使用纯文本密码。

我的计划是使用 md5 哈希,因为可以使用 MySql 函数轻松更改现有密码,并且我也希望为 GWT-Ext 端找到一个简单的解决方案。但正如我发现的那样,GWT 不支持 java.security 并且似乎没有任何其他实现可用于将密码字符串更改为客户端的 md5 哈希。

到目前为止,我发现的唯一“解决方案”是通过 JSNI 重新实现 md5 方法,如下所述: http ://groups.google.com/group/Google-Web-Toolkit/browse_thread/thread/ad09475a9944c9f8

Ext-JS 有一个现有的用户扩展,但我找不到 GWT-Ext 的任何内容: http ://extjs.com/forum/showthread.php?p=133516

有人知道解决这个问题的更优雅/简单的方法吗?也许我应该使用其他东西而不是 md5 来确保密码被加密?

干杯弗兰克

4

5 回答 5

9

就个人而言,我会说你做错了。我不会在客户端散列密码(这就是 GWT)。如果你对你的密码进行哈希处理,你无疑会想给它加盐,否则你很容易受到彩虹攻击。如果您在客户端对其进行哈希 + 加盐,您的用户将可以访问您的盐。

如果我是你,我会在服务器端对你的密码进行哈希 + 加盐。这将允许您使用标准 Java 代码来执行 MD5 哈希。

我的 2 美分。

-J.P

于 2009-08-06T17:17:09.280 回答
6

另一个可能适合您需要的想法是零知识认证。(即服务器永远不需要知道用户的纯文本密码。)

基本上,在设置初始密码时,客户端会对用户的密码进行 N 次哈希处理(其中 N 是一个较大的数字,例如 1000),然后将最终哈希与 N 一起发送到服务器。服务器存储哈希和 N。

稍后,当用户想要进行身份验证时,服务器告诉客户端 N-1,客户端将用户输入 N-1 次的密码散列并发送到服务器。服务器在收到的哈希上再做 1 个哈希,并且(希望)获得存储的哈希。然后服务器存储 N-1 个哈希和 N-1 个数字。

每次用户进行身份验证时,服务器都会减少存储的 N 并保存之前的哈希值。

当 N 降至 0 时,用户必须选择并设置新密码。

服务器必须确保它永远不会要求相同的迭代,否则它很容易受到重放的影响。您不能真正从客户端强制执行该条件,因为客户端(尤其是浏览器)无法可靠地跟踪最后一个 N。

于 2009-08-07T00:14:29.233 回答
2

您可以使用gwt-crypto在客户端生成SHA-1哈希:

String getSHA1for(String text) {
  SHA1Digest sd = new SHA1Digest();
  byte[] bs = text.getBytes();
  sd.update(bs, 0, bs.length);
  byte[] result = new byte[20];
  sd.doFinal(result, 0);
  return byteArrayToHexString(result);
}

String byteArrayToHexString(final byte[] b) {
  final StringBuffer sb = new StringBuffer(b.length * 2);
  for (int i = 0, len = b.length; i < len; i++) {
    int v = b[i] & 0xff;
    if (v < 16) sb.append('0');
    sb.append(Integer.toHexString(v));
  }
  return sb.toString();
}
于 2011-11-03T00:10:21.273 回答
0

您永远不应该使用 md5 或其他散列函数来加密密码。请参阅http://codahale.com/how-to-safely-store-a-password/

于 2013-02-22T13:40:51.343 回答
0

你想要gwt-crypto。它包括许多标准的加密货币。

于 2020-02-02T02:03:01.943 回答