Java-使用MD5对密码进行加密

涎涎原创约 1896 字大约 6 分钟...JavaJava

Java-使用MD5对密码进行加密

注意

本博文仅供学术研究和交流参考,严禁将其用于商业用途。如因违规使用产生的任何法律问题,使用者需自行负责。

Md5Utils.java

package net.ptcs.my12306.util;
import java.security.MessageDigest;
public class Md5Utils {
	public static void main(String[] args) {
		System.out.println(Md5Utils.md5("123456"));
	}
	public final static String md5(String s) {
		char hexDigits[] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
				'a', 'b', 'c', 'd', 'e', 'f' };
		try {
			byte[] btInput = s.getBytes();
			MessageDigest mdInst = MessageDigest.getInstance("MD5");
			mdInst.update(btInput);
			byte[] md = mdInst.digest();
			int j = md.length;
			char str[] = new char[j * 2];
			int k = 0;
			for (int i = 0; i < j; i++) {
				byte byte0 = md[i];
				str[k++] = hexDigits[byte0 >>> 4 & 0xf];
				str[k++] = hexDigits[byte0 & 0xf];
			}
			return new String(str);
		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}
}

得到结果为:

e10adc3949ba59abbe56e057f20f883e

打开Pl/sql工具将所有的测试用户密码均加密操作 sql语句:

select * from MY12306_TAB_USER t

update my12306_tab_user set password = 'e10adc3949ba59abbe56e057f20f883e';

在登陆时使用Md5 LoginServlet.java

package net.ptcs.my12306.controller;

import java.io.IOException;
import java.net.URLEncoder;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import net.ptcs.my12306.entity.Users;
import net.ptcs.my12306.service.UserService;
import net.ptcs.my12306.util.Md5Utils;

/**
 * Servlet implementation class LoginServlet
 */
@WebServlet(description = "", urlPatterns = { "/LoginServlet" })
public class LoginServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

	@Override
	protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		//解决乱码问题
		request.setCharacterEncoding("utf-8");
		response.setCharacterEncoding("utf-8");
		//1.获取登录页面的数据
		String username = request.getParameter("username");
		String password = request.getParameter("password");
		String code = request.getParameter("code");
		String auto = request.getParameter("auto_Login");//获取用户是否自动登录的复选框的值

		//2、服务端非空校验
		StringBuffer sb = new StringBuffer();
		if(username == null || "".equals(username.trim())) {
			sb.append("用户名为空");
		}
		if(password == null || "".equals(password.trim())) {
			if(sb.length() == 0) {//此处是为咯让页面显示只有一个提示,而不是一堆提示信息
				sb.append("密码为空");
			}
		}
		if(code == null || "".equals(password.trim())) {
			if(sb.length() == 0) {
				sb.append("验证码为空");
			}
		}
		if(sb.length() > 0) {
			request.setAttribute("login_message", sb.toString());
			request.getRequestDispatcher("/login.jsp").forward(request, response);
		}else {
			//3.验证码合法性校验
			String session_code=(String) request.getSession().getAttribute("code");
			if(session_code.equalsIgnoreCase(code)) {//不区分大小写的比对
				/* 怎么写登录?
				 * 2.调用底层service的login方法,返回一条用户数据,这是一种用户体验
				 * 
				 * 如果用户信息不为空,则登录成功,跳转到用户模块的主页面
				 * 如果用户信息为空,则登录失败,提示失败信息并返回登录页面
				 */
				UserService service = UserService.getInstance();
				
				Users user = service.login(username,Md5Utils.md5(password));
				System.out.println("user:67line " + user);
				if(user == null) {
					//登录失败
//					request.setAttribute("message", "用户名或者密码错误");//这里是测试jsp页面java代码的接收参数
					request.setAttribute("login_message", "用户名或者密码错误");
					request.getRequestDispatcher("/login.jsp").forward(request, response);
				}else {
					//登陆成功
					//登录成功
					//在主页面中显示用户信息,1.把用户信息放入一个地方,这个地方各个页面都可以从这里拿数据,
					//那么这个地方是HttpSession
					HttpSession session=request.getSession();
					session.setAttribute("user", user);
					
					//根据用户是否自动登录,来写cookie
					if("auto".equals(auto))
					{
						//写Cookie的套路:先new一个cookie,然后调用response的addCookie方法就可以写cookie了
						Cookie username_cookie=new Cookie("username", URLEncoder.encode(username, "utf-8"));
						username_cookie.setMaxAge(7*24*60*60);//过期时间为一周(备注:值为-1会话级cookie关闭浏览器失效 值为 0不记录cookie)
						username_cookie.setPath(request.getContextPath()+"/");//设置cookie到当前工程的路径
						
						Cookie password_cookie=new Cookie("password",Md5Utils.md5(password));
						password_cookie.setMaxAge(7*24*60*60);
						password_cookie.setPath(request.getContextPath()+"/");
						
						Cookie rule_cookie=new Cookie("rule",user.getRule());
						rule_cookie.setMaxAge(7*24*60*60);
						rule_cookie.setPath(request.getContextPath()+"/");
						
						response.addCookie(username_cookie);
						response.addCookie(password_cookie);
						response.addCookie(rule_cookie);
					}
					
					//成功后跳转到哪?要看用户的rule:如果是管理员,去往管理员主页面;如果是普通用户,去往普通用户主页面
					if("2".equals(user.getRule())) {
						//普通用户
						request.getRequestDispatcher("user/index.jsp").forward(request,response);
					}else {
						//管理员
						request.getRequestDispatcher("admin/index.jsp").forward(request, response);
					}
				}
			}else {
				//验证码输入错误
				request.setAttribute("login_message", "验证码输入错误");
				request.getRequestDispatcher("/login.jsp").forward(request, response);
			}
		}
	}
}

在注册时使用Md5 UserServlet.java

package net.ptcs.my12306.controller;

import java.io.IOException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import net.ptcs.my12306.entity.CertType;
import net.ptcs.my12306.entity.City;
import net.ptcs.my12306.entity.UserType;
import net.ptcs.my12306.entity.Users;
import net.ptcs.my12306.service.UserService;
import net.ptcs.my12306.util.Md5Utils;

/**
 * Servlet implementation class UserServlet
 */
@WebServlet(description = "", urlPatterns = { "/UserServlet" })
public class UserServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

	@Override
	protected void service(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		request.setCharacterEncoding("utf-8");
		response.setCharacterEncoding("utf-8");
		
		//1.获取数据
		String username=request.getParameter("username");//用户名
		String password=request.getParameter("password");//密码
		String confirm_password=request.getParameter("confirm_password");//确认密码
		String real_name = request.getParameter("real_name");//真实姓名
		String sex=request.getParameter("sex");//性别
		String province = request.getParameter("province");//省份
		String city = request.getParameter("city");//城市
		String cert_type = request.getParameter("cert_type");//证件类型
		String cert = request.getParameter("cert");//证件号码
		String birthday_date=request.getParameter("birthday");//出生日期
		String user_type = request.getParameter("user_type");//旅客类型
		String content = request.getParameter("content");//备注
		String agree = request.getParameter("agree");//是否同意on/null 被选中/非选

		//2.数据的非空校验和合法性校验
		StringBuffer sb = validateRegisterForm(username, password, confirm_password,agree);
		
		if(sb.length() > 0) {
			//如果校验不通过,那么返回注册页面,让用户再注册一次
			request.setAttribute("message", "必填信息为空,请重新注册");
			request.getRequestDispatcher("/ToRegisterViewServlet").forward(request, response);
		}else {
			//3.调用底层service的注册方法添加用户到数据库
			Date birthday=null;
			try {
				birthday=new SimpleDateFormat("yyyy-MM-dd").parse(request.getParameter("birthday"));
			} catch (Exception e) {
				e.printStackTrace();
			}
			UserService userService=UserService.getInstance();

//			Integer id, String username, String password, String rule,
//			String realname, Character sex, City city, CertType certtype,
//			String cert, Date birthday, UserType usertype, String content,
//			Character status, String loginIp, String imagePath   String.charAt(Integer.parseInt(sex))  cert_type user_type 1
			
//			Users user = new Users(null,username,password,"2",real_name,null,
//					new City().setCityId(city),null,cert,birthday,null,content,null,request.getRemoteAddr(),null);//此处应该将所有的数据插入
			
			Users user = new Users();
			user.setUsername(username);//用户名
			user.setPassword(Md5Utils.md5(password));//密码
			user.setRule("2");//用户类型 2为普通用户
			user.setRealname(real_name);//真实姓名
			user.setSex(sex.charAt(0));//性别 String 转 Character
			
			City c = new City();
			c.setCityId(city);
			user.setCity(c);//获取城市 String 转 引用类型
			
			user.setCerttype(new CertType(Integer.parseInt(cert_type), null));//证件类型 String 转 引用类型
			
			user.setCert(cert);//证件号码
			
			try {
				user.setBirthday(new SimpleDateFormat("yyyy-MM-dd").parse(birthday_date));
			} catch (ParseException e) {
				e.printStackTrace();
			}//出身日期 String 转 date
			
			user.setUsertype(new UserType(Integer.parseInt(user_type), null));//旅客类型 String 转 引用类型
			
			user.setContent(content);//备注
			user.setLoginIp(request.getRemoteAddr());//设置IP
			
			//服务端校验通过之后,注册方法调用之前,应该先判断用户名是否已经存在
			/*
			 * 则需要定义判断用户名是否已经存在的方法,如果存在则返回注册页面,提示用户名已经存在,
			 * 								 如果不存在则继续注册
			 */

			if(userService.isExistsUserName(username))
			{
				//用户名已经存在,回到注册页面
				request.setAttribute("message", "用户名已被占用");
//				request.getRequestDispatcher("/user_register.jsp").forward(request, response);
				request.getRequestDispatcher("/ToRegisterViewServlet").forward(request, response);
			}else
			{
				if(userService.register(user))
				{
					//System.out.println("register success");
					//注册成功,重定向去到登录页面
					//request.getRequestDispatcher("/login.jsp").forward(request, response);
					/*
					 
					 //弹窗效果:技术实现,对响应进行设置,响应就是response
					response.setContentType("text/html;charset=utf-8");
					//获取输出流,输出一段script代码
					PrintWriter pw=response.getWriter();
					pw.println("<script>alert('"+"注册成功"+"');location.href='login.jsp';</script>");
				
					 
					 */
					//生产环境不用挨骂的代码:需求,既要有弹窗又要重定向登录页面
					
					response.sendRedirect(request.getContextPath()+"/login.jsp?message=registersuccess");
					
					//response.sendRedirect(request.getContextPath()+"/login.jsp");//request.getContextPath()===/my12306_user_register
				}else
				{
//					System.out.println("register fail");
					//注册失败,回到注册页面
					request.setAttribute("message", "注册失败");
					//request.getRequestDispatcher("/user_register.jsp").forward(request, response);
					request.getRequestDispatcher("/ToRegisterViewServlet").forward(request, response);
				}
			}
		}
	}
	/**
	 * 对表单进行服务端校验的方法 
	 * @param username
	 * @param password
	 * @param confirm_password
	 * @return 
	 */
	private StringBuffer validateRegisterForm(String username, String password,String confirm_password,String agree) {
		StringBuffer validate_message=new StringBuffer();
		if(username==null||"".equals(username))
		{
			validate_message.append("用户名为空");
		}
		if(password==null||"".equals(password)||confirm_password==null||"".equals(confirm_password))
		{
			validate_message.append("密码或者确认密码为空");
		}
		if(!password.equals(confirm_password))
		{
			validate_message.append("两次密码输入不一致");
		}
		if(agree == null) {
			validate_message.append("请阅读《中国铁路客户服务中心网站服务条款》并勾选");
		}
		if(validate_message.length()>0)
		{
			System.out.println(validate_message.toString());
			return validate_message;
		}
		return validate_message;
	}
}

以上就是我对于Md5加密密码使用的总结


分割线


相关信息

以上就是我关于 Java-使用MD5对密码进行加密 知识点的整理与总结的全部内容,希望对你有帮助。。。。。。。

上次编辑于:
贡献者: 涎涎
评论
  • 按正序
  • 按倒序
  • 按热度
Powered by Waline v2.15.4