[GWT / GWT-Ext中的密码字符串的md5哈希?

问题描述 投票:4回答:5

我目前正在尝试修改现有的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来确保密码已加密?

欢呼弗兰克

java javascript gwt md5 gwt-ext
5个回答
9
投票

个人而言,我会说您做错了。我不会在客户端哈希密码(这就是GWT)。如果您对密码进行哈希处理,则毫无疑问要加盐,否则您将容易受到rainbow攻击。如果您在客户端进行哈希+盐添加,则您的用户可以访问您的盐添加。

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

我的2美分。

-JP


6
投票

可能满足您需求的另一个想法是称为零知识身份验证。 (即服务器永远不需要知道用户的纯文本密码。)

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

稍后,当用户想要进行身份验证时,服务器会告知客户端N-1,然后客户端会对用户输入N-1次的哈希密码,并将其发送给服务器。服务器对接收到的哈希再执行1次哈希,并(有希望)获取存储的哈希。然后,服务器存储N-1个散列和N-1个数字。

每次用户认证时,服务器将减小存储的N并保存以前的哈希。

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

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


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();
}

0
投票

您绝对不应使用md5或其他哈希函数进行密码加密。参见http://codahale.com/how-to-safely-store-a-password/


0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.