package com.kexue.skills.utils;

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

/**
 * @author 维哥
 * @Description MD5加密工具类
 * @create 2025-02-21 23:09
 */
public class MD5Util {

    /**
     * 使用Java自带的MessageDigest实现MD5加密
     *
     * @param input 待加密的字符串
     * @return 加密后的十六进制字符串
     * @throws NoSuchAlgorithmException 如果找不到MD5算法实现
     */
    public static String encryptToHex(String input) throws NoSuchAlgorithmException {
        // 获取MessageDigest实例，指定使用MD5算法
        MessageDigest md = MessageDigest.getInstance("MD5");

        // 将待加密字符串转换为字节数组
        byte[] bytes = input.getBytes();

        // 执行MD5哈希计算
        byte[] hashBytes = md.digest(bytes);

        // 将哈希结果转换为十六进制字符串
        StringBuilder hexString = new StringBuilder();
        for (byte b : hashBytes) {
            String hex = Integer.toHexString(0xff & b);
            if (hex.length() == 1) {
                hexString.append('0');
            }
            hexString.append(hex);
        }

        return hexString.toString();
    }
    
    /**
     * 双重MD5加密（客户端加密一次，服务端再加密一次）
     * 用于密码验证：客户端先对密码进行MD5加密，服务端再用该方法加密后与数据库中的密码比对
     * 
     * @param clientEncryptedPassword 客户端加密后的密码
     * @param salt 盐值
     * @return 双重加密后的密码
     * @throws NoSuchAlgorithmException
     */
    public static String doubleEncrypt(String clientEncryptedPassword, String salt) throws NoSuchAlgorithmException {
        // 客户端已经对密码进行了一次MD5加密，服务端再用MD5+Salt加密一次
        return encryptToHex(clientEncryptedPassword + salt);
    }
}
