迫於項目需求,編寫了一個 MD5加密再加鹽的工具類,代碼如下:外露 加密方法與校驗方法
import java.security.MessageDigest;
import java.util.UUID;
/**
* @author:xingquanxiang createTime:2020/1/10 18:47
* description: 加密加鹽工具類, 帶加密 和 校驗
*/
public class PasswordUtil {
/**
* md5加密處理
* @param s
* @return
*/
private static String md5(String s) {
try {
//MessageDigest是封裝md5算法的工具對象還支持SHA算法
MessageDigest md = MessageDigest.getInstance("MD5");
//通過digest拿到的任意字符串,得到的bates都是等長的
byte[] bytes = md.digest(s.getBytes("utf-8"));
return toHex(bytes);
}
catch (Exception e) {
throw new RuntimeException(e);
}
}
private static String toHex(byte[] bytes) {
//toHex的字符串把二進制轉換成十六進制
final char[] HEX_DIGITS = "0123456789ABCDEF".toCharArray();
StringBuilder ret = new StringBuilder(bytes.length * 2);
//循環判斷是爲了補位操作
for (int i=0; i<bytes.length; i++) {
ret.append(HEX_DIGITS[(bytes[i] >> 4) & 0x0f]);
ret.append(HEX_DIGITS[bytes[i] & 0x0f]);
}
return ret.toString();
}
/**
* 生成隨機字符串 長度爲 8
* @return
*/
private static String salt(){
//使用UUID通用唯一識別碼,取第一個-前面的值
UUID uuid = UUID.randomUUID();
String[] arr = uuid.toString().split("-");
return arr[0];
}
/**
* 對密碼進行加密加鹽操作
* @param password
* @return
*/
public static String encode(String password){
//加密
String hexPwd = md5(password);
//生成鹽
String salt = salt();
//加鹽操作
StringBuilder builder = new StringBuilder(hexPwd);
builder.insert(18, salt);
//返回加密加鹽後的字符串
return builder.toString();
}
/**
* 校對密碼是否匹配,匹配則返回true
* @param password
* @param dbPassword
* @return
*/
public static boolean match(String password, String dbPassword){
StringBuilder builder = new StringBuilder(dbPassword);
//去鹽操作,生成md5加密後原始字符
builder.replace(18, 26, "");
//加密新密碼,生成md5加密字符
password = md5(password);
//校對加密字符與原始字符是否匹配
return password.equals(builder.toString());
}
public static void main(String[] args) {
String password = "cndsHFHknvildhnoiseygh/;'.''..";
String encode = encode(password);
System.out.println(match(password, encode));
}
}