package com.hrs.util;

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

/**   
* Copyright: Copyright (c) 2026 chinasofti
* 
* @ClassName: MD5Util.java
* @Description: MD5加密工具类
*
* @version: v1.0.0
* @author: 李鑫
* @date: 2026年4月13日 上午10:10:21 
*
* Modification History:
* Date         Author          Version            Description
*---------------------------------------------------------*
* 2026年4月13日     李鑫           v1.0.0               新建文件
*/
public class MD5Util {
    /**
     * 
    * @Function: md5
    * @Description: 将字符串进行MD5加密
    *
    * @param: str 要加密的字符串
    * @return：String MD5加密后的32位小写字符串
    * @throws：NoSuchAlgorithmException
    *
    * @version: v1.0.0
    * @author: 李鑫
    * @date: 2025年4月6日 上午10:20:32 
    *
    * Modification History:
    * Date         Author          Version            Description
    *---------------------------------------------------------*
    * 2025年4月6日     李鑫           			v1.0.0                             新建方法
     */    
    public static String md5(String str) {
        if (str == null || str.isEmpty()) {
            return null;
        }
        
        try {
            MessageDigest md = MessageDigest.getInstance("MD5");
            byte[] bytes = md.digest(str.getBytes());
            
            // 将字节数组转换为十六进制字符串
            StringBuilder sb = new StringBuilder();
            for (byte b : bytes) {
                // 取字节的高四位
                int high = (b >> 4) & 0x0f;
                // 取字节的低四位
                int low = b & 0x0f;
                sb.append(hexChar(high));
                sb.append(hexChar(low));
            }
            
            return sb.toString();
            
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
            return null;
        }
    }
    /**
     * 
    * @Function: hexChar
    * @Description: 将0-15的数字转换为十六进制字符
    *
    * @param: value 0-15的整数值
    * @return：char 对应的十六进制字符
    * @throws：无
    *
    * @version: v1.0.0
    * @author:  李鑫
    * @date: 2025年4月6日 上午10:24:58 
    *
    * Modification History:
    * Date         Author          Version            Description
    *---------------------------------------------------------*
    * 2025年4月6日      李鑫           			v1.0.0                             新建方法
     */    
    private static char hexChar(int value) {
        if (value >= 0 && value <= 9) {
            return (char) ('0' + value);
        } else {
            return (char) ('a' + (value - 10));
        }
    }
    /**
     * 
    * @Function: verify
    * @Description: 验证密码是否匹配
    *
    * @param: inputPassword 用户输入的明文密码, storedPassword 数据库中存储的MD5密码
    * @return：boolean 是否匹配
    * @throws：无
    *
    * @version: v1.0.0
    * @author: 李鑫
    * @date: 2025年4月6日 上午10:28:42 
    *
    * Modification History:
    * Date         Author          Version            Description
    *---------------------------------------------------------*
    * 2025年4月6日     李鑫           			v1.0.0                             新建方法
     */    
    public static boolean verify(String inputPassword, String storedPassword) {
        String encrypted = md5(inputPassword);
        return encrypted != null && encrypted.equals(storedPassword);
    }
    /**
     * 
    * @Function: main
    * @Description: 测试方法
    *
    * @param: String[] 命令行参数
    * @return：无
    * @throws：无
    *
    * @version: v1.0.0
    * @author: 李鑫
    * @date: 2025年4月6日 上午10:30:25 
    *
    * Modification History:
    * Date         Author          Version            Description
    *---------------------------------------------------------*
    * 2025年4月6日     李鑫          			v1.0.0                             新建方法
     */    
    public static void main(String[] args) {
        String password = "123456";
        String encrypted = md5(password);
        System.out.println("明文密码：" + password);
        System.out.println("MD5加密：" + encrypted);
        System.out.println("长度：" + encrypted.length());
        
        // 验证
        System.out.println("验证结果：" + verify("123456", encrypted));
    }
}