VB转Java实现MD5哈希结果不一致问题排查求助
VB转Java MD5哈希结果不一致的问题排查与修复
问题根源分析
你的两段代码存在三个关键差异,直接导致哈希结果不一致:
字符编码不匹配
VB中使用的UnicodeEncoding对应UTF-16LE(小端序),而Java代码错误地采用了UTF-8编码,还额外添加了UTF-8的BOM(0xEFBBBF),完全偏离了VB的编码逻辑。MD5计算流程错误
VB直接对编码后的字节数组计算MD5,再将哈希结果的字节数组直接转Base64;但Java代码先把MD5哈希转成十六进制字符串,再将该字符串转成UTF-8字节后才做Base64编码,多了一次无意义的字符串转换,导致结果完全不同。MD5实例化方式不规范
Java代码里直接new MD5()不符合JDK标准用法,正确方式是通过MessageDigest.getInstance("MD5")获取MD5实例。
修正后的Java代码
private String PasswortlevelHash(String strPasswortlevel, String strDay, String strMonth, String strYear) throws Exception { // 获取标准MD5实例 MessageDigest md5 = MessageDigest.getInstance("MD5"); String strForHash = "MS-U4_2022_10_10setup"; // 使用UTF-16LE编码,对应VB的UnicodeEncoding byte[] bytHashNeu = strForHash.getBytes("UTF-16LE"); // 计算MD5哈希 byte[] hashBytes = md5.digest(bytHashNeu); // 直接对哈希字节数组做Base64编码 return Base64.getEncoder().encodeToString(hashBytes); }
验证结果
修正后的代码运行结果会和VB代码完全一致:h1qKTNN456AqTZUPPaft3Q==
内容的提问来源于stack exchange,提问作者greddy2010
相关产品推荐
相关产品推荐

