
club.zhcs.lina.auth.encode.PasswordUtils Maven / Gradle / Ivy
The newest version!
package club.zhcs.lina.auth.encode;
import java.security.SecureRandom;
import java.util.Random;
import org.nutz.lang.Lang;
import org.nutz.lang.Strings;
import lombok.experimental.UtilityClass;
/**
*
* @author Kerbores([email protected])
*
*/
@UtilityClass
public class PasswordUtils {
private static Random rand = new SecureRandom();
/**
* 加盐迭代多次摘要
*
* @param algorithm
* 摘要算法
* @param password
* 明文密码
* @param salt
* 加密盐
* @param iterations
* 迭代次数
* @return 密文
*/
public static String encode(String algorithm, String password, String salt, int iterations) {
return Lang.digest(algorithm, password.getBytes(), salt.getBytes(), iterations);
}
/**
* MD5固定盐多次摘要
*
* @param password
* 明文密码
* @param salt
* 加密盐
* @return 密文
*/
public static String encode(String password, String salt) {
return encode("MD5", password, salt, 2);
}
/**
* MD5固定盐密码匹配
*
* @param rawPassword
* 明文密码
* @param salt
* 盐
* @param password
* 密文
* @return 是否匹配
*/
public static boolean check(String rawPassword, String salt, String password) {
return Strings.equalsIgnoreCase(encode(rawPassword, salt), password);
}
/**
* MD5随机盐摘要
*
* @param password
* 明文
* @return 摘要
*/
public static String randomSaltEncode(String password) {
return randomSaltEncode(password, 5);
}
/**
* MD5随机盐摘要
*
* @param password
* 明文
* @param iterations
* 迭代次数
* @return 摘要
*/
public static String randomSaltEncode(String password, int iterations) {
StringBuilder sb = new StringBuilder(16);
sb.append(rand.nextInt(99999999)).append(rand.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 = Lang.digest("MD5", password.getBytes(), salt.getBytes(), iterations);
char[] cs = new char[48];
for (int i = 0; i < 48; i += 3) {
cs[i] = password.charAt(i / 3 * 2);
char c = salt.charAt(i / 3);
cs[i + 1] = c;
cs[i + 2] = password.charAt(i / 3 * 2 + 1);
}
return new String(cs);
}
/**
* MD5随机盐摘要验证
*
* @param password
* 明文
* @param md5
* 密文
* @return 是否匹配
*/
public static boolean randomSaltVerify(String password, String md5) {
return randomSaltVerify(password, md5, 5);
}
/**
* MD5随机盐摘要验证
*
* @param password
* 明文
* @param md5
* 摘要
* @param iterations
* 迭代次数
* @return 是否匹配
*/
public static boolean randomSaltVerify(String password, String md5, int iterations) {
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 Strings.equalsIgnoreCase(Lang.digest("MD5", password.getBytes(), salt.getBytes(), iterations), new String(cs1));
}
/**
* 加密
*
* @param password
* 明文密码
* @return 密文
*/
public static String encode(String password) {
return randomSaltEncode(password);
}
/**
* 验证密码是否匹配
*
* @param rawPassword
* 明文密码
* @param encodedPassword
* 加密密码
* @return 是否匹配
*/
public static boolean match(String rawPassword, String encodedPassword) {
return randomSaltVerify(rawPassword, encodedPassword);
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy