MD5概述

用户名密码保存在客户端是一种十分危险的行为。所以需要进行加密后保存。

其中MD5就是一种比较常用的加密算法。

与其说MD5算法是一种加密算法,不如说是一种数据指纹(数据摘要)算法。

其特点如下:

任意大小的二进制数经过MD5计算后都能得到一个独一无二的128位二进制数。

不同的数据算出的MD5绝对不相同。

相同的数据算出的MD5一定相同。

只能有明文算出密文,密文是永远也无法算成明文的。

MD5大量应用于计算机中。如数据库中保存的密码通常都是经过MD5加密后的数据。如用户下载文件时可以进行MD5校验防止数据被篡改。

在记住用户名案例中,我们可以使用MD5进行加密后再保存在客户端,从而保证数据安全。

在数据库中保存的密码也不宜直接存储为明文。也要经过MD5加密后存储。

第一步:编写一个MD5的工具类

package cn.bingou.util;import java.math.BigInteger;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;public class MD5Utils {public static String md5(String plainText){// 用来保存加密后的密文的数组byte[] secreBytes = null;try {// 将明文转成byte数组并进行加密,获得密文数组secreBytes = MessageDigest.getInstance("md5").digest(plainText.getBytes());} catch (NoSuchAlgorithmException e) {throw new RuntimeException("没有md5这个算法");}// 将二进制数组转车过16进制表示的字符串String md5code = new BigInteger(1, secreBytes).toString(16);//128位2进制数组转成16进制时,可能不足32位//在字符串前面补0,使所有的字符串长度一定是32位for(int i=0; i<32-md5code.length();i++){md5code = "0"+md5code;}return md5code;}
}

第二步:调用工具类

注册用户的代码中调用MD5的工具类,将明文密码变为MD5密文。

package cn.bingou.web;import java.io.IOException;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;import cn.bingou.domain.User;
import cn.bingou.factory.BaseFactory;
import cn.bingou.service.UserService;
import cn.bingou.service.UserServiceImpl;
import cn.bingou.util.JDBCUtils;
import cn.bingou.util.MD5Utils;
import cn.bingou.util.WebUtils;public class RegistServlet extends HttpServlet {public void doGet(HttpServletRequest req, HttpServletResponse resp)throws ServletException, IOException {//        // 1.请求乱码问题
//            // 请求乱码-POST请求
//        req.setCharacterEncoding("utf-8");
//            // 应答乱码问题
//        resp.setContentType("text/html;charset=utf-8");// 2.接收表单参数String username = req.getParameter("username");String password = req.getParameter("password");String password2 = req.getParameter("password2");String nickname = req.getParameter("nickname");String email = req.getParameter("email");String valistr = req.getParameter("valistr");// 3.验证表单// 1)非空验证if(WebUtils.isEmpty(username)){ // 用户名为空验证// 向request作用域中添加错误提示信息req.setAttribute("errMsg", "用户名不能为空!");// 将请求转发给regist.jsp,forward():请求转发req.getRequestDispatcher("/regist.jsp").forward(req, resp);// 如果用户输入为空,直接返回return;}if(WebUtils.isEmpty(password)){ // 密码为空验证req.setAttribute("errMsg", "密码不能为空!");req.getRequestDispatcher("/regist.jsp").forward(req, resp);return;}if(WebUtils.isEmpty(nickname)){ // 昵称为空验证req.setAttribute("errMsg", "昵称不能为空!");req.getRequestDispatcher("/regist.jsp").forward(req, resp);return;}if(WebUtils.isEmpty(email)){ // 邮箱为空验证req.setAttribute("errMsg", "邮箱不能为空!");req.getRequestDispatcher("/regist.jsp").forward(req, resp);return;}// 2)密码一致验证if(!password.equals(password2)){// 如果密码与确认密码不一样,则输出错误req.setAttribute("errMsg", "密码不一致");req.getRequestDispatcher("/regist.jsp").forward(req, resp);return;}// 3)邮箱格式验证// abc@123.163.comString reg="^\\w+@\\w+(\\.\\w+)+$"; if(!email.matches(reg)){req.setAttribute("errMsg", "邮箱格式不符");req.getRequestDispatcher("/regist.jsp").forward(req, resp);return;}// 4)用户名是否存在UserService userService=BaseFactory.getFactory().getInstance(UserService.class);boolean flag=userService.hasUsername(username);if(flag){//用户名已存在// 向request作用域中添加错误提示信息req.setAttribute("errMsg", "用户名已存在");// 将请求转发给regist.jspreq.getRequestDispatcher("/regist.jsp").forward(req, resp);return;}// 5)验证码验证if(WebUtils.isEmpty(valistr)){ // 验证码为空验证req.setAttribute("errMsg", "验证码不能为空!");req.getRequestDispatcher("/regist.jsp").forward(req, resp);return;} else{// 验证码不为空,执行验证码内容验证// 获取保存在session中的正确验证码HttpSession session=req.getSession(false);// 如果当前Session没有就为nullboolean flag1=true; // 默认验证码没有问题if(session==null && session.getAttribute("text")==null){// 没有session对象,或者session中没有正确的验证码文本flag1=false;}else{String text=(String) session.getAttribute("text");if(!valistr.equalsIgnoreCase(text)){// 用户输入的文本和正确文本不一致flag1=false;}}if(flag1==false){// 向request作用域中添加错误提示信息req.setAttribute("errMsg", "验证码错误");// 将请求转发给regist.jspreq.getRequestDispatcher("/regist.jsp").forward(req, resp);return;}}// 将密码进行MD5加密password=MD5Utils.md5(password);// 4.数据存入数据库User user=new User(-1, username, password, nickname, email);boolean flag1=userService.registUser(user);if(flag1){// 保存成功-提示成功信息,定时刷新到首页resp.getWriter().write("<h1 style='text-align:center;color:red'>恭喜您,注册成功!3秒后自动跳转首页</h1>");// 实现定时刷新resp.setHeader("refresh", "3;url="+req.getContextPath()+"/index.jsp");}else{req.setAttribute("errMsg", "注册出现异常,请稍后重试...");req.getRequestDispatcher("/regist.jsp").forward(req, resp);return;}}public void doPost(HttpServletRequest req, HttpServletResponse resp)throws ServletException, IOException {doGet(req, resp);}}

用户登陆的时候也要将输入的密码转换成MD5加密之后的密文,与数据库里面的密文进行比对。

package cn.bingou.web;import java.io.IOException;
import java.net.URLEncoder;import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;import cn.bingou.domain.User;
import cn.bingou.exception.MsgException;
import cn.bingou.factory.BaseFactory;
import cn.bingou.service.UserService;
import cn.bingou.util.MD5Utils;public class LoginServlet extends HttpServlet {public void doGet(HttpServletRequest req, HttpServletResponse resp)throws ServletException, IOException {// 获取web.xml中配置的字符集String encode=this.getServletContext().getInitParameter("encode");
//        // 1.处理乱码-请求乱码
//        // POST请求乱码
//        req.setCharacterEncoding(encode);// 2.接收请求参数String username=req.getParameter("username");// 使用request.getParameter可以获得表单传过来的值 String password=req.getParameter("password");String remname=req.getParameter("remname");// 3.表单验证// 将用户的明文密码转成MD5加密后的密码password=MD5Utils.md5(password);// 4.执行逻辑 // 1)记住用户名// 判断用户是否勾选了记住用户名if(remname != null && "true".equals(remname)){// 勾选了记住用户名// 创建一个保存用户名的Cookie// URLEncoder.encode用来对一个字符串进行编码Cookie cookie=new Cookie("rename",URLEncoder.encode(username,encode));// 设置一个有效时间cookie.setMaxAge(60*60*24*30);// 手动设置一个路径 web应用的根路径// EasyMall被配置成了虚拟主机的默认web应用// 导致req.getContextPath()返回 ""// setPath("")-》无效的,所以setPath(""+"/")->有效            cookie.setPath(req.getContextPath()+"/");// 将Cookie添加到Response中
            resp.addCookie(cookie);}else{// 如果没有勾选记住用户名-删除之前保存的CookieCookie cookie=new Cookie("remname","");cookie.setPath(req.getContextPath()+"/");cookie.setMaxAge(0);// 删除当前Cookie
            resp.addCookie(cookie);}// 2)登陆// 判断用户的用户名和密码是否正确UserService userServlet=BaseFactory.getFactory().getInstance(UserService.class);User user=null;try {user=userServlet.login(username, password);} catch (MsgException e) {e.printStackTrace();req.setAttribute("errMsg", e.getMessage());req.getRequestDispatcher("/login.jsp").forward(req, resp);return;}if(user != null){// 登录成功-向session中添加登录状态req.getSession().setAttribute("user", username);System.out.println(user.getUsername());System.out.println(username);// 重定向到首页resp.sendRedirect(req.getContextPath()+"/index.jsp");}else{//添加错误提示信息,并返回login.jspreq.setAttribute("errMsg", "用户名或密码错误");req.getRequestDispatcher("/login.jsp").forward(req, resp);}}public void doPost(HttpServletRequest req, HttpServletResponse resp)throws ServletException, IOException {doGet(req, resp);}}

转载于:https://www.cnblogs.com/chuijingjing/p/9813870.html

13.MD5对用户密码进行加密相关推荐

  1. C#中使用MD5对用户密码加密与解密

    C#中常涉及到对用户密码的加密于解密的算法,其中使用MD5加密是最常见的的实现方式.本文总结了通用的算法并结合了自己的一点小经验,分享给大家. 一.使用16位.32位.64位MD5方法对用户名加密 1 ...

  2. 使用MD5对用户密码加密与解密

    MD5简介 : MD5的全称是Message-Digest Algorithm 5,在90年代初由MIT的计算机科学实验室和RSA Data Security Inc发明,经MD2.MD3和MD4发展 ...

  3. 用户密码的加密解密操作(前端加密,后端解密)

    用户密码的加密解密操作 作者是个小菜狗,行文过程基本都基于自己理解,没有深入查阅文献,如有错误,还请大神指出 背景: 公司做的是一个某某平台的系统,包括前台和后台,作者刚毕业,刚开始试用,带我的师傅让 ...

  4. Android 使用MD5对SharedPreferences密码进行加密

    在每个Android软件都会使用到SharedPreferences,将密码保存在本地,但是由于没有对密码进行加密,只要用户对手机进行root,获取了权限就很容易得到密码,为了防止密码外露,每个And ...

  5. Discuz!6.1.0 用户密码如何加密的?

    Discuz!6.1.0 用户密码是放在uc_members 表中的,cdb_members 表中的密码是随机放的,没有作用 用户的密码加密方式 $password 用户密码 $salt        ...

  6. 如何正确对用户密码进行加密?转自https://blog.csdn.net/zhouyan8603/article/details/80473083...

    本文介绍了对密码哈希加密的基础知识,以及什么是正确的加密方式.还介绍了常见的密码破解方法,给出了如何避免密码被破解的思路.相信读者阅读本文后,就会对密码的加密有一个正确的认识,并对密码正确进行加密措施 ...

  7. Windows用户密码的加密方法与破解

    再研究Hastcat的时候涉及到了Windows的Hash破解,感觉这个地方还是有一些姿势点和细节的,特此写文章记录之. Hash简介 Hash 一般翻译为"散列",也可直接音译为 ...

  8. 如何正确对用户密码进行加密?

    本文介绍了对密码哈希加密的基础知识,以及什么是正确的加密方式.还介绍了常见的密码破解方法,给出了如何避免密码被破解的思路.相信读者阅读本文后,就会对密码的加密有一个正确的认识,并对密码正确进行加密措施 ...

  9. Linux中查看用户密码(加密方式)

    我们知道linux是一个多用户的操作系统,也就是说在linux系统中存储着很多不同用户的用户名及密码.那么如果某一个用户的密码忘记了怎么办? 首先我们得知道,在linux系统中,用户名被存放在了/et ...

  10. 数据中心密码翻译、eas用户密码的加密和解密

    1.加密和解密datacenter的数据库密码 加密:com.kingdee.bos.sql.KSqlUtil.encodePassword(password); 解密: 1.管理控制台执行 deco ...

最新文章

  1. FZU 1686 神龙的难题(DLX反复覆盖)
  2. w10查询自己电脑ip
  3. 分页类实例 java
  4. 学习计算机游戏编程,在线游戏学编程,游戏编程汇总
  5. 多个字段条件相同进行分组并过滤拼装SQL
  6. python语言能做什么-python语言到底可以做什么呢?
  7. html中transition默认,CSS3中的Transition详解
  8. oracle spool
  9. 宇宙质量估算为10^53KG
  10. docker运行jenkins挂掉_docker搭建jenkins
  11. ubuntu 14.04 install teamviewer
  12. 冰点下载器手机版apk_冰点下载器官网
  13. pe系统怎么安装linux系统教程,U盘安装windows+ubuntu+winpe三系统详细教程
  14. LRc2022 M1原生支持功能介绍,Lightroom Classic 2022 Mac M1专用 ,解决lr闪退打不开卡死等一系列问题
  15. 测试用例设计方法_正交实验法(游戏向)
  16. python怎么把二维数组转化一维数组,python 二维数组转一维数组
  17. 扎拉赞恩 服务器 微信群,魔兽8.0剧透 回归的扎拉赞恩与沃金的骨灰
  18. java-IO流(4)-对象流及其序列化介绍
  19. uva-1600 巡逻机器人
  20. HTML(HBuilder)作业题4- 隔行换色(jquery)

热门文章

  1. 魔兽世界3.35+mysql_新魔兽世界3.35兔子王版本商业 一键启动服务端
  2. [Irving] SQL 2005/SQL 2008 备份数据库并自动删除N天前备份的脚本
  3. LeetCode——跳跃游戏
  4. metrics 指标分析——你不在意的p99和p999
  5. Android 网易云信直播
  6. 象棋的杀法??????
  7. 浪潮存储通过ISCSI映射至Linux服务器、多路径配置方法
  8. 什么是编程?为什么要编程?
  9. 什么?HomeKit、米家、Aqara等生态也能通过智汀与天猫精灵生态联动?
  10. 在CheckiO上熟悉编程