我目前正在尝试修改一个现有的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来确保密码是加密的?
干杯弗兰克
发布于 2009-08-06 17:17:09
就我个人而言,我会说你做错了。我不会在客户端散列密码(这就是GWT )。如果你散列你的密码,你无疑会想要对它加盐,否则你将容易受到rainbow攻击。如果你在客户端散列加盐,你的盐将会被你的用户访问。
如果我是你,我会在服务器端对你的密码进行哈希加盐。这将允许您使用您的标准Java代码来执行MD5散列。
我的两分钱。
-JP
发布于 2009-08-07 00:14:29
另一个可能适合你需要的想法是所谓的零知识认证。(即服务器永远不需要知道用户的明文密码。)
基本上,在设置初始密码时,客户端将用户的密码散列N次(其中N是一个较大的数字,如1000),然后将最终的散列与N一起发送到服务器。服务器存储散列和N。
稍后,当用户想要进行身份验证时,服务器告诉客户端N-1,客户端将用户键入的密码散列N-1次并将其发送到服务器。服务器对收到的哈希值再做1次哈希运算,并(希望)获得存储的哈希值。然后,服务器存储N-1个散列和N-1个数字。
每次用户进行身份验证时,服务器都会递减存储的N并保存先前的散列。
当N降到0时,用户必须选择并设置新密码。
服务器必须确保它永远不会请求相同的迭代,否则它很容易受到重播的影响。您不能真正从客户端强制执行该条件,因为客户端(尤其是浏览器)不能可靠地跟踪最后的N。
发布于 2011-11-03 08:10:21
您可以使用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();
}https://stackoverflow.com/questions/1238628
复制相似问题