All Downloads are FREE. Search and download functionalities are using the official Maven repository.

club.zhcs.lina.auth.encode.PasswordUtils Maven / Gradle / Ivy

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