package com.ard.work.sdk.zlxd.service; import java.math.BigInteger; import java.nio.charset.StandardCharsets; import java.security.MessageDigest; /** * 中林信达加密策略 * * @author 刘苏义 * @since 2023-11-07 */ public final class ZlxdLoginEncryptor { private static final String FIXED_SALT = "PreLogin:PreLogin"; private ZlxdLoginEncryptor() { // 工具类不允许实例化 } /** * 生成登录加密摘要 * * @param username 用户名 * @param password 密码 * @param sessionId 会话ID(PreLogin 返回) * @param challenge 随机挑战码(PreLogin 返回) * @return 加密后的字符串(MD5),参数不完整返回 null */ public static String encrypt( String username, String password, String sessionId, String challenge ) { if (isBlank(username) || isBlank(password) || isBlank(sessionId) || isBlank(challenge)) { return null; } // step1: MD5(username:sessionId:password) String step1Plain = username + ":" + sessionId + ":" + password; String step1Hash = md5(step1Plain); // step2: MD5("PreLogin:PreLogin") String salt = md5(FIXED_SALT); // step3: MD5(step1Hash:challenge:salt) String finalPlain = step1Hash + ":" + challenge + ":" + salt; return md5(finalPlain); } private static String md5(String input) { try { MessageDigest md = MessageDigest.getInstance("MD5"); byte[] digest = md.digest(input.getBytes(StandardCharsets.UTF_8)); // 保持和 BigInteger.toString(16) 行为一致(不补0) return new BigInteger(1, digest).toString(16); } catch (Exception e) { throw new RuntimeException("MD5 encrypt error", e); } } private static boolean isBlank(String s) { return s == null || s.trim().isEmpty(); } }