我目前正在尝试修改现有的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来确保密码是加密的?
干杯 弗兰克
答案 0 :(得分:9)
就个人而言,我会说你做错了。我不会在客户端散列密码(这就是GWT)。如果您对密码进行哈希处理,您无疑会想要加密密码,否则您将受到rainbow攻击。如果你在客户端哈希+盐,你的用户可以访问你的盐。
如果我是你,我会在服务器端哈希密码。这将允许您使用标准Java代码来执行MD5哈希。
我的2美分。
-jP
答案 1 :(得分:6)
可能符合您需求的另一个想法是零知识认证。 (即服务器永远不需要知道用户的纯文本密码。)
基本上,在设置初始密码时,客户端会用户密码N次(其中N是一个大的数字,如1000),然后将最终的哈希值与N一起发送到服务器。服务器存储哈希值和N
稍后,当用户想要进行身份验证时,服务器会告知客户端N-1,并且客户端会将用户键入N-1次的密码哈希并将其发送到服务器。服务器在接收到的哈希上再做一次哈希,并且(希望)获得存储的哈希值。然后,服务器存储N-1个哈希值和N-1个号码。
每次用户进行身份验证时,服务器都会减少存储的N并保存以前的哈希值。
当N下降到0时,用户必须选择并设置新密码。
服务器必须确保它永远不会要求相同的迭代,否则它很容易重放。您无法从客户端实际执行该条件,因为客户端(尤其是浏览器)无法可靠地跟踪最后N个。
答案 2 :(得分: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();
}
答案 3 :(得分:0)
永远不要使用md5或其他哈希函数进行密码加密。见http://codahale.com/how-to-safely-store-a-password/
答案 4 :(得分:0)
您想要gwt-crypto。它包含许多标准的加密货币。