MD5随机盐值生成法

public class Test3 {

/** 
* 生成含有随机盐的密码 
*/ 
public static String generate(String password) { 
Random r = new Random(); 
StringBuilder sb = new StringBuilder(16); 
sb.append(r.nextInt(99999999)).append(r.nextInt(99999999)); 
int len = sb.length(); 
if (len < 16) { 
for (int i = 0; i < 16 - len; i++) { 
sb.append("0"); 
} 
} 
String salt = sb.toString(); 
password = md5Hex(password + salt); 
char[] cs = new char[48]; 
for (int i = 0; i < 48; i += 3) {
//取MD5后密文的第一位
cs[i] = password.charAt(i / 3 * 2);

//取盐值的第一位
char c = salt.charAt(i / 3); 
cs[i + 1] = c;

//取MD5后密文的第二位
cs[i + 2] = password.charAt(i / 3 * 2 + 1); 
}

 

//生成的密文包括MD5的密文和盐值,顺序为一位密文,一位盐值,一位密文
return new String(cs); 
} 

/** 
* 校验密码是否正确 
*/ 
public static boolean verify(String password, String md5) { 
char[] cs1 = new char[32]; 
char[] cs2 = new char[16]; 
for (int i = 0; i < 48; i += 3) { 
cs1[i / 3 * 2] = md5.charAt(i); 
cs1[i / 3 * 2 + 1] = md5.charAt(i + 2); 
cs2[i / 3] = md5.charAt(i + 1); 
} 
String salt = new String(cs2); 
return md5Hex(password + salt).equals(new String(cs1)); 
} 

/** 
* 获取十六进制字符串形式的MD5摘要 
*/ 
public static String md5Hex(String src) { 
try { 
MessageDigest md5 = MessageDigest.getInstance("MD5"); 
byte[] bs = md5.digest(src.getBytes()); 
return new String(new Hex().encode(bs)); 
} catch (Exception e) { 
return null; 
} 
} 

public static void main(String[] args) { 
String password = generate("admin");
System.out.println(password);
System.out.println(verify("admin", password)); 
}
原文地址:https://www.cnblogs.com/lupeng2010/p/6061739.html