MD5加密

mac2024-06-01  43

MD5


md5加密的基本实现:

md5:消息摘要算法之一,128位的摘要信息,加密利用的主要是hash函数的不可逆性,由jdk提供实现方法,进行消息摘要后返回一个byte数组,再将byte数组转成十六进制就完成了加密。

public static String md5() { String str = "fdfsaerew"; try { // 获取MessageDigest实例,并指定加密算法 MessageDigest md = MessageDigest.getInstance("MD5"); // 对字节数组进行摘要,得到摘要数组 byte[] md5Byte = md.digest(str.getBytes()); // 将加密后的byte数组转成十六进制返回 return Hex.encodeHexString(md5Byte); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } return null; }
用户注册,数据库密文存储密码

在进行MD5加密时为了安全一般都会加盐值,apache提供的shiro包下面有多种加密方式,也给MD5提供了多种构造方法,其中就有加密字符串+盐值。有pom文件的项目直接添加依赖会比较方便一点,我这里用的是javaweb项目,就用另一种引入盐值的方法。 javaweb项目:MD5+盐值 主要加密思想就是 随机生成盐值(盐值长度由注册时传过来的数值决定),先跟要加密的字符串合并,再产生消息摘要。

public class EncryptionUtil { /** * 注册用户时,随机获取盐值 * * @param length * @return */ public static String getMd5HashSalt(int length) { /** * 盐值 */ String string = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"; StringBuffer stringBuffer = new StringBuffer(); try { // 生成一个产生随机数的实例 Random random = SecureRandom.getInstanceStrong(); for (int i = 0; i < length; i++) { // 从定义好的字符中选取要求长度的salt int number = random.nextInt(string.length()); stringBuffer.append(string.charAt(number)); } } catch (NoSuchAlgorithmException e) { System.out.println("EncryptionUtil#getMd5HashSalt:" + e.getMessage()); } return stringBuffer.toString(); } public static String md5Hash(String password, String salt) { // 密码加盐 password = password + salt; try { // 获取MessageDigest实例,并指定加密算法 MessageDigest digest = MessageDigest.getInstance("MD5"); // 对字节数组进行摘要,得到摘要数组 byte[] md5Byte = digest.digest(password.getBytes()); return Hex.encodeHexString(md5Byte); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } return null; } }

用户注册时:

public class RegisterServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doPost(req,resp); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //创建变量接收页面上传来的数据 String username; String password; // 随机生成盐值 String salt = EncryptionUtil.getMd5HashSalt(16); username = req.getParameter("username"); password = req.getParameter("password"); // 调用修改的构造函数,给密码加密 User user = new User(username,password,salt); //调用添加用户的方法: Service service = new ServiceImpl(); service.registerUser(user); if (username != null && username !=""){ if(password != null && password != ""){ System.out.println("注册成功"); resp.sendRedirect(req.getContextPath()+"/login.jsp"); } else { System.out.println("密码不能为空....."); } } else { System.out.println("用户名不能为空..."); } } }

用户登录,输入注册时设置的密码,当密码传到方法中时,根据用户名查询到用户,用数据库中存放的盐值再跟页面传过来的密码进行一次加密,把结果拿来跟从数据库里查到的密码比较,完成登录验证。

public class LoginServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doPost(req, resp); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { System.out.println("进入了Post处理方法....."); //创建用户 User user = new User(); //创建变量接收用户信息 String username; String password; //接收 username = req.getParameter("username"); password = req.getParameter("password"); Service service = new ServiceImpl(); user = service.loginUser(username); // 获取通过用户名查到的用户盐值,用盐值给页面传入的密码加密 String md5Password = EncryptionUtil.md5Hash(password,user.getSalt()); // 加密后的字符串与从数据库查出来的字符串密码比较 if (user.getUsername() != null && user.getPassword() != null) { if (!(user.getUsername().equals(username))) { System.out.println("用户名不存在"); resp.sendRedirect(req.getContextPath() + "/login.jsp"); } else if (!(user.getPassword().equals(md5Password))) { System.out.println("密码错误"); resp.sendRedirect(req.getContextPath() + "/login.jsp"); } else { System.out.println("登录成功"); req.getSession().setAttribute("user", user); req.getRequestDispatcher("/loginSuccess.jsp").forward(req, resp); } } else { System.out.println("用户名,密码不能为空,请重新登录"); resp.sendRedirect(req.getContextPath() + "/login.jsp"); } } @Override public void destroy() { super.destroy(); } @Override public void init() throws ServletException { super.init(); } }

注册时调用的关键在修改了user实体类的构造方法,在登录时就是直接调用的加密工具类中的方法,其实都可以直接调用工具类中的 方法的。

user里面添加的一个构造方法

public User(String username, String password, String salt) { this.username = username; this.password = EncryptionUtil.md5Hash(password,salt); this.salt = salt; }
最新回复(0)