package org.security; import org.apache.commons.codec.digest.DigestUtils; import java.util.UUID; import cn.hutool.core.util.StrUtil; /** * @author 50649 */ public class PasswordUtils{ /** * 1.加盐并生成最终的密码 * @param password 明文的密码 * @return 最终生成的密码 */ public static String encrypt(String password){ //a.产生盐值 //UUID.randomUUID()会生成32位数字+4位-,是随机的唯一的,将4位-去掉就得到32位数字的盐值 String salt = UUID.randomUUID().toString().replace("-",""); //生成加盐后的密码(需要使用MD5) String saltPassword = DigestUtils.md5Hex((salt + password).getBytes()); //生成最终的密码格式 String finalPassword = salt + "$" + saltPassword; return finalPassword; } /** * 2.加盐并生成最终密码格式(方法一的重载),区别于上面的方法:这个方法是用来解密的,给定了盐值,生成一个最终密码, 后面要和正确的最终密码进行比对 * @param password 需要验证的明文密码 * @param salt * @return */ public static String encrypt(String password, String salt){ //1.生成一个加密后的密码 String saltPassword = DigestUtils.md5Hex((salt + password).getBytes()); //2.生成最终的密码(待验证) String finalPassword = salt + "$" + saltPassword; return finalPassword; } /** * 3.验证密码 * @param inputPassword 登录用户输入的明文密码 * @param finalPassword 数据库中实际的最终密码格式 * @return */ public static boolean check(String inputPassword, String finalPassword){ //首先判断这两个参数到底有没有值,数据库中的最终密码是不是65位 if(StrUtil.isNotBlank(inputPassword) && StrUtil.isNotBlank(finalPassword) && finalPassword.length() == 65){ //a.首先从最终的密码中得到盐值 //使用$将finalPassword划分成两个部分,前面的32位的部分就是盐值 //注意:这里的$是被认为是一个通配符,所以要转义一下 String salt = finalPassword.split("\\$")[0]; //b.使用之前加密的方法,生成最终的密码格式(待验证) String checkPassword = encrypt(inputPassword,salt); if(checkPassword.equals(finalPassword)){ return true; } } return false; } }
标签:return,String,密码,finalPassword,加密,password,salt From: https://www.cnblogs.com/xianz666/p/18499436