【发布时间】:2012-11-07 03:02:22
【问题描述】:
在客户端,我对字符串进行 MD5 加密,然后对生成的哈希进行 BASE 64 编码。
这个最终的编码字符串然后用于服务器端的比较。
我能够在许多测试用例中成功执行此操作,但在以下测试用例中失败了。
MD5 字符串
2679:07071960:09348448:3:08912206:3:EXPRESS:1:EU4NW31E7INEC1X
我的 MD5 哈希字符串:
291423A531148527A9524EA0924CDF68
我的 Base64 编码字符串:
KRQjpTEUhSepUk6gkkzfaA==
当我尝试将用于 BASE64 编码的 MD5 哈希字符串放在 http://www.opinionatedgeek.com/dotnet/tools/base64encode/ 上时,它会生成以下字符串:
MjkxNDIzQTUzMTE0ODUyN0E5NTI0RUEwOTI0Q0RGNjg=
但是,当我尝试解码我的 Base64 字符串时,即“KRQjpTEUhSepUk6gkkzfaA==”,这里是http://www.opinionatedgeek.com/dotnet/tools/Base64Decode/Default.aspx,我正在获取我的哈希码(在十六进制编辑器中打开正在生成的 .bin 文件)。
那么,一个字符串可能有多个Base64编码值吗?
我正在使用下面的代码来生成编码字符串:
public static String getHashCode(String text)
{
MessageDigest md;
byte[] md5hash = new byte[32];
try{
md = MessageDigest.getInstance("MD5");
md.update(text.getBytes("iso-8859-1"), 0, text.length());
md5hash = md.digest();
}
catch(Exception e)
{
return "-1";
}
String encoded = Base64.encode(md5hash);
String retValue = new String(encoded);
return retValue;
}
请提出问题所在以及如何确保我们在客户端和服务器端使用相同的摘要。
【问题讨论】:
-
理论上你可以有两个字符串给出相同的 MD5,但 Base64 是一种对称的无损编码。但也有 Base64 的变体(参见wikipedia)。
-
较短的是原始字节,较长的是文本。我认为不可能将 2 个不同的 Base64(忽略转义)解码为同一个字符串。
标签: java encryption base64 md5