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();
|
}
|
}
|