原文地址:http://www.blogjava.net/heyang/archive/2010/11/27/339188.html
登录Web系统时通常都采用用户名和密码的形式,如果这样的数据以明码的方式放在数据库中的话无疑会给别有用心的人以可趁之机,所以采取一定的防范措施是必要的。
现在比较安全的方式是用MD5进行加密,利用Apache commons的DigestUtils工具类我们可以迅速做到这一点。
要得到Apache commons的DigestUtils工具类,你必须加载commons-codec-1.x.jar包,我使用的是commons-codec-1.3.jar。使用的具体类是:org.apache.commons.codec.digest.DigestUtils.
下面,我们的任务是,当用户注册时,将他注册的密码加密后存入数据库,下面请见具体代码:
1
//
对密码进行加密,加密后再通过Hibernate往数据库里存
2 String changedPswd = DigestUtils.md5Hex(pswd);
3
4 User user = new User(name,changedPswd,email,brief);
5
6 if (service.hasSameName(name)){
7 // 同名检测
8 request.setAttribute( " msg " , " 已经有和' " + name + " '同名的用户存在了,请换个名称注册. " );
9 return new ActionForward( " /web/page/register.jsp " );
10 }
11
12 if (service.hasSameEmail(email)){
13 // 同Emial检测
14 request.setAttribute( " msg " , " 已经有和' " + email + " '相同的用户存在了,请换个Email注册. " );
15 return new ActionForward( " /web/page/register.jsp " );
16 }
17
18 try {
19 service.create(user);
20 saveUserRegisterInforToLog(user,request);
21 request.setAttribute( " msg " , "" + name + " ,欢迎您的加盟.Ȼ������¼��ť " );
22 return new ActionForward( " /web/page/login.jsp " );
23 }
24 catch (Exception ex){
25 String str = " 创建用户时遇到未预计的异常,具体的异常信息为' " + ex.getMessage() + " ',请与系统维护人员联系. " ;
26 request.setAttribute( " msg " ,str );
27 logger.fatal(str);
28 return new ActionForward( " /web/page/register.jsp " );
29 }
2 String changedPswd = DigestUtils.md5Hex(pswd);
3
4 User user = new User(name,changedPswd,email,brief);
5
6 if (service.hasSameName(name)){
7 // 同名检测
8 request.setAttribute( " msg " , " 已经有和' " + name + " '同名的用户存在了,请换个名称注册. " );
9 return new ActionForward( " /web/page/register.jsp " );
10 }
11
12 if (service.hasSameEmail(email)){
13 // 同Emial检测
14 request.setAttribute( " msg " , " 已经有和' " + email + " '相同的用户存在了,请换个Email注册. " );
15 return new ActionForward( " /web/page/register.jsp " );
16 }
17
18 try {
19 service.create(user);
20 saveUserRegisterInforToLog(user,request);
21 request.setAttribute( " msg " , "" + name + " ,欢迎您的加盟.Ȼ������¼��ť " );
22 return new ActionForward( " /web/page/login.jsp " );
23 }
24 catch (Exception ex){
25 String str = " 创建用户时遇到未预计的异常,具体的异常信息为' " + ex.getMessage() + " ',请与系统维护人员联系. " ;
26 request.setAttribute( " msg " ,str );
27 logger.fatal(str);
28 return new ActionForward( " /web/page/register.jsp " );
29 }
以上第二行代码是进行MD5加密的处理,如果用户输入的密码是123456789,则会得到25f9e794323b453885f5181f1b624d0b这样的字符串。
注册用户后,数据库中您将看到如下的对应记录,看到这样的文字,要去反猜原始密码是非常困难的,当然您有山东大学王小云教授的本事则不费吹灰之力。
下面,我们还要对登录时做一番处理,因为登录时用的是原始密码,我们应该对它进行加密后再和数据库中的对应字段进行比对,代码如下:
User user
=
objs.get(
0
);
// 得到MD5加密后的密码
String changedPswd = DigestUtils.md5Hex(password);
// 再与数据库中用户密码进行比对
if (user.getPassword().equals(changedPswd) == false ){
throw new ErrorPswdException( " 密码不匹配. " );
} else {
return user;
}
// 得到MD5加密后的密码
String changedPswd = DigestUtils.md5Hex(password);
// 再与数据库中用户密码进行比对
if (user.getPassword().equals(changedPswd) == false ){
throw new ErrorPswdException( " 密码不匹配. " );
} else {
return user;
}
以上代码中,password是用户在页面输入的原始密码,changedPswd是经过MD5加密后的密码,user是按名称查询出来的用户,他的密码部分就是已经经过MD5加密的,我们拿这两个密码进行比对即可。
之所以没有反向还原是因为MD5加密和Base64不一样,前者是不可逆的,后者则可以还原。当然,Base64不是严格意义上的加密手段。
最后的问题,如果数据库中原有数据未经加密怎么办,好在MySql数据库提供了md5函数帮我们做到这一点,使用update projectmanager_user set pswd= md5( pswd ) 这样的语句就可以将原来数据库中的密码部分用MD5加密了。
下面的图片演示了这一过程:
原始数据:
使用update projectmanager_user set pswd=md5(pswd)加密后的数据库记录: