代码之家  ›  专栏  ›  技术社区  ›  FrankS

GWT/GWT ext中密码字符串的MD5哈希?

  •  4
  • FrankS  · 技术社区  · 15 年前

    我目前正在尝试修改一个现有的GWText应用程序,它在MySQL数据库中使用纯文本密码。

    我的计划是使用MD5散列,因为现有的密码可以很容易地通过mysql函数进行修改,我希望也能为GWText找到一个简单的解决方案。但我发现,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 回复  |  直到 12 年前
        1
  •  9
  •   JP Richardson    15 年前

    就个人而言,我会说你做错了。我不会在客户端散列密码(这就是GWT)。如果你散列你的密码,你无疑会想加盐,否则你将容易受到 rainbow 攻击。如果您在客户机端散列+盐,您的盐将可以被您的用户访问。

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

    我的2美分。

    JP

        2
  •  6
  •   Trevor Harrison    15 年前

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

    基本上,当设置初始密码时,客户机将用户密码散列n次(其中n是一个较大的数字,如1000),然后将最终散列与n一起发送到服务器。服务器存储散列和n。

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

    每次用户进行身份验证时,服务器会减少存储的n并保存上一个哈希。

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

    服务器必须确保它从不请求相同的迭代,否则它容易受到重播的攻击。您不能从客户端强制执行该条件,因为客户端(尤其是浏览器)不能可靠地跟踪最后一个n。

        3
  •  2
  •   Rok StrniÅ¡a    13 年前

    你可以使用 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();
    }
    
        4
  •  0
  •   user2099621    12 年前

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