密码数据MD5加密
一、程序说明
1.数据库 MySQL
2.JQuery表单验证
3.开发环境:win7+tomcat6+myeclipse9.0
二、基本流程图
三、运行界面
1.注册界面
2.表单验证
3.提交注册信息
4.数据库信息
四、程序主要代码
1.MD5类
public class Md5 {
public final static String getMD5(String str){
try {
MessageDigest md = MessageDigest.getInstance("MD5"); //创建具有指定算法名称的摘要
md.update(str.getBytes()); //使用指定的字节数组更新摘要
byte mdBytes[] = md.digest(); //进行哈希计算并返回一个字节数组
String hash = "";
for(int i= 0;i<mdBytes.length;i++){ //循环字节数组
int temp;
if(mdBytes[i]<0) //如果有小于0的字节,则转换为正数
temp =256+mdBytes[i];
else
temp=mdBytes[i];
if(temp<16)
hash+= "0";
hash+=Integer.toString(temp,16); //将字节转换为16进制后,转换为字符串
}
return hash;
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
return null;
}
}
2.UserDao类
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
![](https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif)
1
public
class
UserDao {
2 private static UserDao instance = null ;
3 /**
4 * 返回一个UserDao实例
5 * @return
6 */
7 public static UserDao getInstance(){
8 if (instance == null ) instance = new UserDao();
9 return instance;
10 }
11
12 public boolean checkname(User user){
13 Connection con = null ;
14 try {
15 con = DBCon.getConn(); // 创建数据库连接
16 String sql = " select count(id) as count from tb_user where name=? " ;
17 PreparedStatement pstmt = con.prepareStatement(sql);
18 pstmt.setString( 1 , user.getUserName()); // 对SQL语句第1个参数赋值
19 ResultSet rs = pstmt.executeQuery();
20 if (rs.next()) {
21 if (rs.getInt( " count " ) == 0 ){
22 return true ;
23 }
24 }
25 } catch (Exception ex){
26 ex.printStackTrace();
27 } finally {
28 try {
29 con.close();
30 } catch (SQLException e) {
31 e.printStackTrace();
32 }
33 }
34 return false ;
35 }
36
37 /**
38 * 保存用户注册信息
39 * @param user
40 * @return
41 */
42
43 public boolean saveUser(User user){
44 Connection con = null ;
45 try {
46 con = DBCon.getConn(); // 创建数据库连接
47 String sql = " insert into tb_user(name,pwd,sex,age,createTime) values(?,?,?,?,?) " ;
48 PreparedStatement pstmt = con.prepareStatement(sql); // 预编译insert语句
49 pstmt.setString( 1 , user.getUserName()); // 对SQL语句第1个参数赋值
50 pstmt.setString( 2 , user.getUserPwd()); // 对SQL语句第2个参数赋值
51 pstmt.setString( 3 , user.getUserSex()); // 对SQL语句第3个参数赋值
52 pstmt.setInt( 4 , user.getUserAge()); // 对SQL语句第4个参数赋值
53 pstmt.setString( 5 , user.getUserLoginTime()); // 对SQL语句第5个参数赋值
54 int row = pstmt.executeUpdate(); // 执行插入操作并返回所影响的行数
55 if (row == 1 )
56 return true ; // 数据插入成功返回true
57 } catch (Exception ex){
58 ex.printStackTrace();
59 } finally {
60 try {
61 con.close();
62 } catch (SQLException e) {
63 e.printStackTrace();
64 }
65 }
66 return false ;
67 }
68
69 }
2 private static UserDao instance = null ;
3 /**
4 * 返回一个UserDao实例
5 * @return
6 */
7 public static UserDao getInstance(){
8 if (instance == null ) instance = new UserDao();
9 return instance;
10 }
11
12 public boolean checkname(User user){
13 Connection con = null ;
14 try {
15 con = DBCon.getConn(); // 创建数据库连接
16 String sql = " select count(id) as count from tb_user where name=? " ;
17 PreparedStatement pstmt = con.prepareStatement(sql);
18 pstmt.setString( 1 , user.getUserName()); // 对SQL语句第1个参数赋值
19 ResultSet rs = pstmt.executeQuery();
20 if (rs.next()) {
21 if (rs.getInt( " count " ) == 0 ){
22 return true ;
23 }
24 }
25 } catch (Exception ex){
26 ex.printStackTrace();
27 } finally {
28 try {
29 con.close();
30 } catch (SQLException e) {
31 e.printStackTrace();
32 }
33 }
34 return false ;
35 }
36
37 /**
38 * 保存用户注册信息
39 * @param user
40 * @return
41 */
42
43 public boolean saveUser(User user){
44 Connection con = null ;
45 try {
46 con = DBCon.getConn(); // 创建数据库连接
47 String sql = " insert into tb_user(name,pwd,sex,age,createTime) values(?,?,?,?,?) " ;
48 PreparedStatement pstmt = con.prepareStatement(sql); // 预编译insert语句
49 pstmt.setString( 1 , user.getUserName()); // 对SQL语句第1个参数赋值
50 pstmt.setString( 2 , user.getUserPwd()); // 对SQL语句第2个参数赋值
51 pstmt.setString( 3 , user.getUserSex()); // 对SQL语句第3个参数赋值
52 pstmt.setInt( 4 , user.getUserAge()); // 对SQL语句第4个参数赋值
53 pstmt.setString( 5 , user.getUserLoginTime()); // 对SQL语句第5个参数赋值
54 int row = pstmt.executeUpdate(); // 执行插入操作并返回所影响的行数
55 if (row == 1 )
56 return true ; // 数据插入成功返回true
57 } catch (Exception ex){
58 ex.printStackTrace();
59 } finally {
60 try {
61 con.close();
62 } catch (SQLException e) {
63 e.printStackTrace();
64 }
65 }
66 return false ;
67 }
68
69 }
3.js(表单验证)
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
![](https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif)
1
$(document).ready(
function
(){
2
3 $( " form :input.required " ).each( function (){
4 var $required = $( " <strong class='high'> *</strong> " );
5 $( this ).parent().append($required);
6 });
7
8 // 重置操作
9 $( " #res " ).click( function (){
10 $( " .formtips " ).remove();
11 });
12
13 $( ' form :input ' ).blur( function (){
14 var $parent = $( this ).parent();
15
16 $parent.find( " .formtips " ).remove();
17 // 验证账户
18 if ($( this ).is( ' #username ' )){
19
20 if ( this .value == "" || this .value.length < 3 ){
21 var Msg = " <font color=red>账户名最短不能小于三位<font> " ;
22 $parent.append( ' <span class = "formtips onError"> ' + Msg + ' </span> ' );
23 } else {
24 var username = $( " #username " ).val();
25 $.ajax({
26 type: " post " ,
27 url: " check.jsp?type=name " ,
28 data:{username:username},
29 success: function (data,textStatus){
30 if (data[ 0 ].success == " success " ){
31 var Msg = " <font color=green>恭喜你,该用户名尚未被注册!</font> " ;
32 $parent.append( ' <span class="formtips onSuccess"> ' + Msg + ' </span> ' );
33
34 } else {
35 var Msg = " <font color=red>用户名已经存在,请重新输入!</font> " ;
36 $parent.append( ' <span class="formtips onError"> ' + Msg + ' </span> ' );
37 }
38
39 },
40 error: function (data, textStatus) {
41 }
42 });
43 }
44 }
45 // 验证密码
46 if ($( this ).is( ' #userpwd1 ' )){
47 if ( this .value == "" || this .value.length < 6 ){
48 var errorMsg = " <font color=red>密码最短不能小于6位<font> " ;
49 $parent.append( ' <span class = "formtips onError"> ' + errorMsg + ' </span> ' );
50 } else {
51 var okMsg = " <font color=green>输入符合格式<font> " ;
52 $parent.append( ' <span class="formtips onSuccess"> ' + okMsg + ' </span> ' );
53 }
54 }
55 // 验证确认密码
56 // 2011/04/30 叶茂安修改
57 if ($( this ).is( ' #userpwd2 ' )){
58 if ($( this ).val() == $( " #userpwd1 " ).val() && this .value != "" ){
59 var Msg = " <font color=green>密码输入正确</font> " ;
60 $parent.append( ' <span class = "formtips onSuccess"> ' + Msg + ' </span> ' );
61 }
62 else {
63 var Msg = " <font color=red>请确认两次输入一致且不为空</font> " ;
64 $parent.append( ' <span class="formtips onError"> ' + Msg + ' </span> ' );
65 }
66 }
67 });
68
69
70 $( " #send " ).click( function (){
71 var username = $( " #username " ).val();
72 var userpwd = $( " #userpwd1 " ).val();
73 var userage = $( " #userage " ).val();
74 var usersex = $( " #usersex " ).find( " option:selected " ).text();
75 $.ajax({
76 type: " post " ,
77 url: " saveuser.jsp " ,
78 contentType: " application/x-www-form-urlencoded; charset=utf-8 " ,
79 cache: true ,
80 data:{ username:username,userpwd:userpwd,userage:userage,usersex:usersex},
81 success: function (data,textStatus){
82 if (data[ 0 ].success == " success " ){
83 var Msg = " success! " ;
84 } else {
85 var Msg = " failure! " ;
86 }
87 alert(Msg);
88 },
89 error: function (data, textStatus) {
90 }
91 });
92 });
93 });
2
3 $( " form :input.required " ).each( function (){
4 var $required = $( " <strong class='high'> *</strong> " );
5 $( this ).parent().append($required);
6 });
7
8 // 重置操作
9 $( " #res " ).click( function (){
10 $( " .formtips " ).remove();
11 });
12
13 $( ' form :input ' ).blur( function (){
14 var $parent = $( this ).parent();
15
16 $parent.find( " .formtips " ).remove();
17 // 验证账户
18 if ($( this ).is( ' #username ' )){
19
20 if ( this .value == "" || this .value.length < 3 ){
21 var Msg = " <font color=red>账户名最短不能小于三位<font> " ;
22 $parent.append( ' <span class = "formtips onError"> ' + Msg + ' </span> ' );
23 } else {
24 var username = $( " #username " ).val();
25 $.ajax({
26 type: " post " ,
27 url: " check.jsp?type=name " ,
28 data:{username:username},
29 success: function (data,textStatus){
30 if (data[ 0 ].success == " success " ){
31 var Msg = " <font color=green>恭喜你,该用户名尚未被注册!</font> " ;
32 $parent.append( ' <span class="formtips onSuccess"> ' + Msg + ' </span> ' );
33
34 } else {
35 var Msg = " <font color=red>用户名已经存在,请重新输入!</font> " ;
36 $parent.append( ' <span class="formtips onError"> ' + Msg + ' </span> ' );
37 }
38
39 },
40 error: function (data, textStatus) {
41 }
42 });
43 }
44 }
45 // 验证密码
46 if ($( this ).is( ' #userpwd1 ' )){
47 if ( this .value == "" || this .value.length < 6 ){
48 var errorMsg = " <font color=red>密码最短不能小于6位<font> " ;
49 $parent.append( ' <span class = "formtips onError"> ' + errorMsg + ' </span> ' );
50 } else {
51 var okMsg = " <font color=green>输入符合格式<font> " ;
52 $parent.append( ' <span class="formtips onSuccess"> ' + okMsg + ' </span> ' );
53 }
54 }
55 // 验证确认密码
56 // 2011/04/30 叶茂安修改
57 if ($( this ).is( ' #userpwd2 ' )){
58 if ($( this ).val() == $( " #userpwd1 " ).val() && this .value != "" ){
59 var Msg = " <font color=green>密码输入正确</font> " ;
60 $parent.append( ' <span class = "formtips onSuccess"> ' + Msg + ' </span> ' );
61 }
62 else {
63 var Msg = " <font color=red>请确认两次输入一致且不为空</font> " ;
64 $parent.append( ' <span class="formtips onError"> ' + Msg + ' </span> ' );
65 }
66 }
67 });
68
69
70 $( " #send " ).click( function (){
71 var username = $( " #username " ).val();
72 var userpwd = $( " #userpwd1 " ).val();
73 var userage = $( " #userage " ).val();
74 var usersex = $( " #usersex " ).find( " option:selected " ).text();
75 $.ajax({
76 type: " post " ,
77 url: " saveuser.jsp " ,
78 contentType: " application/x-www-form-urlencoded; charset=utf-8 " ,
79 cache: true ,
80 data:{ username:username,userpwd:userpwd,userage:userage,usersex:usersex},
81 success: function (data,textStatus){
82 if (data[ 0 ].success == " success " ){
83 var Msg = " success! " ;
84 } else {
85 var Msg = " failure! " ;
86 }
87 alert(Msg);
88 },
89 error: function (data, textStatus) {
90 }
91 });
92 });
93 });
4.saveuser.jsp
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
![](https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif)
1
<%
@ page language
=
"
java
"
contentType
=
"
text/html; charset=UTF-8
"
pageEncoding
=
"
UTF-8
"
%>
2 <% @ page import = " java.util.* " %>
3 <% @ page import = " com.swyma.md5.model.* " %>
4 <% @ page import = " com.swyma.md5.util.* " %>
5 <% @ page import = " com.swyma.md5.dao.* " %>
6
7 <% response.setHeader( " Content-Type " , " text/json " ); %>
8 <%
9
10 request.setCharacterEncoding( " utf-8 " );
11 String userName = request.getParameter( " username " ); // 用户名
12 String userPwd = request.getParameter( " userpwd " ); // 用户密码
13 String userAge = request.getParameter( " userage " ); // 用户年龄
14 int age = 0 ;
15 if (userAge != null &&! userAge.equals( "" )){
16 age = Integer.parseInt(userAge); // 转换为int值
17 }
18 String userSex = request.getParameter( " usersex " ); // 用户性别
19 if (userSex.equals( " 男 " )){
20 userSex = " male " ;
21 } else if (userSex.equals( " 女 " )){
22 userSex = " female " ;
23 }
24 // System.out.println(userName+" "+userPwd+" "+userSex+" "+userAge);
25 User user = new User(); // 创建用户信息对象,将注册信息封装
26 user.setUserName(userName.trim());
27 user.setUserPwd(Md5.getMD5(userPwd)); // 密码加密后封装到User对象中
28 user.setUserAge(age);
29 user.setUserSex(userSex);
30 // 获取当前系统时间的字符串格式
31 String time = CalendarUtil.getParticularDateTime(Calendar.getInstance());
32 user.setUserLoginTime(time);
33 boolean res = UserDao.getInstance().saveUser(user); // 保存注册信息
34 if (res){
35 response.getWriter().write( " [{\"success\":\"success\"}] " );
36 } else {
37 response.getWriter().write( " [{\"success\":\"failure\"}] " );
38 }
39 %>
2 <% @ page import = " java.util.* " %>
3 <% @ page import = " com.swyma.md5.model.* " %>
4 <% @ page import = " com.swyma.md5.util.* " %>
5 <% @ page import = " com.swyma.md5.dao.* " %>
6
7 <% response.setHeader( " Content-Type " , " text/json " ); %>
8 <%
9
10 request.setCharacterEncoding( " utf-8 " );
11 String userName = request.getParameter( " username " ); // 用户名
12 String userPwd = request.getParameter( " userpwd " ); // 用户密码
13 String userAge = request.getParameter( " userage " ); // 用户年龄
14 int age = 0 ;
15 if (userAge != null &&! userAge.equals( "" )){
16 age = Integer.parseInt(userAge); // 转换为int值
17 }
18 String userSex = request.getParameter( " usersex " ); // 用户性别
19 if (userSex.equals( " 男 " )){
20 userSex = " male " ;
21 } else if (userSex.equals( " 女 " )){
22 userSex = " female " ;
23 }
24 // System.out.println(userName+" "+userPwd+" "+userSex+" "+userAge);
25 User user = new User(); // 创建用户信息对象,将注册信息封装
26 user.setUserName(userName.trim());
27 user.setUserPwd(Md5.getMD5(userPwd)); // 密码加密后封装到User对象中
28 user.setUserAge(age);
29 user.setUserSex(userSex);
30 // 获取当前系统时间的字符串格式
31 String time = CalendarUtil.getParticularDateTime(Calendar.getInstance());
32 user.setUserLoginTime(time);
33 boolean res = UserDao.getInstance().saveUser(user); // 保存注册信息
34 if (res){
35 response.getWriter().write( " [{\"success\":\"success\"}] " );
36 } else {
37 response.getWriter().write( " [{\"success\":\"failure\"}] " );
38 }
39 %>
5.数据库(mysql)
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
![](https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif)
1
DROP
TABLE
IF
EXISTS
`md5`.`tb_user`;
2 CREATE TABLE `md5`.`tb_user` (
3 `id` int ( 11 ) NOT NULL AUTO_INCREMENT,
4 `name` varchar ( 20 ) NOT NULL ,
5 `pwd` varchar ( 40 ) NOT NULL ,
6 `sex` varchar ( 5 ) NOT NULL ,
7 `age` int ( 11 ) NOT NULL ,
8 `createTime` datetime NOT NULL ,
9 PRIMARY KEY (`id`)
10 ) ENGINE = InnoDB DEFAULT CHARSET = utf8;
2 CREATE TABLE `md5`.`tb_user` (
3 `id` int ( 11 ) NOT NULL AUTO_INCREMENT,
4 `name` varchar ( 20 ) NOT NULL ,
5 `pwd` varchar ( 40 ) NOT NULL ,
6 `sex` varchar ( 5 ) NOT NULL ,
7 `age` int ( 11 ) NOT NULL ,
8 `createTime` datetime NOT NULL ,
9 PRIMARY KEY (`id`)
10 ) ENGINE = InnoDB DEFAULT CHARSET = utf8;
四、个人总结
1.因为从来没有接触正式的项目,所以很少考虑到用户注册密码加密,这次是在网上看了一些信息才发觉这些密码数据之类的东西确实有必要进行加密。这样才能在一定程序上解决数据保密问题。
2.不过在做这个小例子时还是遇到一些没有解决的问题:
1)这个md5加密,因为在数据库里还是明码显示出生成的md5字符,假如其它用户发现取到了这个md5数据,是不是能很快的对它进行破密呢?
2)是不是有更好的数据加密方法对密码进行加密呢?