package org.agt.module.system.util.ldap;

import org.apache.commons.codec.digest.Sha2Crypt;

public class SHA512CryptVerifier {
    
    /**
     * 验证密码是否匹配SHA-512 Crypt哈希
     * @param password 明文密码
     * @param hash 完整的哈希字符串（包括{CRYPT}前缀）
     * @return 匹配返回true，否则返回false
     */
    public static boolean verifyPassword(String password, String hash) {
        // 去除{CRYPT}前缀（如果存在）
        if (hash.startsWith("{CRYPT}")) {
            hash = hash.substring(7);
        }
        
        try {
            // 使用Apache Commons Codec的Sha2Crypt进行验证
            String computedHash = Sha2Crypt.sha512Crypt(password.getBytes(), hash);
            return computedHash.equals(hash);
        } catch (Exception e) {
            System.err.println("验证失败: " + e.getMessage());
            return false;
        }
    }
    
    /**
     * 生成SHA-512 Crypt哈希
     * @param password 明文密码
     * @param salt 盐值（可选，如果为null则自动生成）
     * @return 哈希值（包含{CRYPT}前缀）
     */
    public static String generateHash(String password, String salt) {
        String hash;
        if (salt != null) {
            hash = Sha2Crypt.sha512Crypt(password.getBytes(), "$6$" + salt);
        } else {
            hash = Sha2Crypt.sha512Crypt(password.getBytes());
        }
        return "{CRYPT}" + hash;
    }
    
    public static void main(String[] args) {
        String storedHash = "{CRYPT}$6$OY7N5bGk$WF6pEJOYU1SEySOuvLxVBNo2MRMsNAX4PX9JnzgUTYfDzevl1/fruztCTM0mIuiAUb3eJ//DEYxzFABmOlIzm/";
        String password = "test"; // 要验证的密码
        
        // 验证密码
        boolean isValid = verifyPassword(password, storedHash);
        System.out.println("密码验证结果: " + isValid);
        
        // 生成新哈希（使用相同盐值）
        String newHash = generateHash(password, "OY7N5bGk");
        System.out.println("生成的哈希: " + newHash);
        System.out.println("哈希匹配: " + newHash.equals(storedHash));
    }
}