求与JavaScript CryptoJS.enc.Base64等效的C#实现,解决MD5转Base64不一致问题
差异原因
两端Base64编码的输入对象不同:
- CryptoJS侧:
CryptoJS.MD5()返回的是MD5计算得到的16字节原始二进制数据,直接对这16字节做Base64编码得到结果 - 当前C#侧:你先把16字节的MD5原始数据转成了32位的十六进制字符串,再对这个32位字符串的UTF8编码字节做Base64编码,输入完全不一样,结果自然不匹配。
正确C#实现
方案1:如果你的CreateMD5方法返回的是十六进制字符串
先把十六进制字符串转回原始MD5字节数组,再做Base64编码:
// 十六进制字符串转字节数组方法 public static byte[] HexStringToByteArray(string hex) { byte[] bytes = new byte[hex.Length / 2]; for (int i = 0; i < hex.Length; i += 2) { bytes[i / 2] = Convert.ToByte(hex.Substring(i, 2), 16); } return bytes; } // 调用逻辑 var md5Hex = CreateMD5("mickeymouse"); var md5Bytes = HexStringToByteArray(md5Hex); var toB64 = Convert.ToBase64String(md5Bytes); // 输出结果:mN8bPgED9XqYF9Z1BxUEug== 和JS侧完全一致
方案2:最优实现(推荐)
直接在计算MD5的时候保留原始字节数组,省略转十六进制再转回字节的冗余步骤:
public static string Md5ToBase64(string input) { using (var md5 = System.Security.Cryptography.MD5.Create()) { byte[] inputBytes = System.Text.Encoding.UTF8.GetBytes(input); byte[] hashBytes = md5.ComputeHash(inputBytes); return Convert.ToBase64String(hashBytes); } } // 调用 var toB64 = Md5ToBase64("mickeymouse"); // 输出结果:mN8bPgED9XqYF9Z1BxUEug==
内容的提问来源于stack exchange,提问作者Ravi Ram
相关产品推荐
相关产品推荐

