MD5哈希失败了大字符串

时间:2010-02-09 21:20:51

标签: java hash md5

我正在制作响应的MD5哈希值,然后使用共享密钥对其进行签名。

对于大多数调用来说,这是有效的,但奇怪的是失败(生成与客户端不同的MD5哈希),只有两个调用会在体内带来大量内容。

这可能是因为身体的大小?或者可能因为这些调用返回内容chunked

任何想法都将受到赞赏。非常感谢。

散列码(请注意algorithm == MD5ENCODING == 'UTF-8'):

private static byte[] hash(String toHash, String algorithm){
      try{
      MessageDigest dg = MessageDigest.getInstance(algorithm);
      dg.update(toHash.getBytes(ENCODING));
      return dg.digest();
    }catch(Exception e){
      throw new ApiInternalException("Error while hashing string: " + toHash,e);
    }
    }

2 个答案:

答案 0 :(得分:2)

如果你包含你的代码,那就太好了。没有它,我只能猜出问题是什么。无论如何,这是在Java中创建MD5哈希的正确方法。如果您的代码与此不同,那么您就遇到了问题。

String plainString = "Hash me please";
String md5Hash = "NOTHASHED";
try {
     MessageDigest md5Digest = MessageDigest.getInstance("MD5");
     md5String = new String(md5Digest.digest(plainString.getBytes()));
} catch (NoSuchAlgorithmException nsae) {
     // MD5 is included in all versions of Java, this can never happen
}

当然,这会返回如下内容:�ǚ���;�f���&fu 如果您希望它是人类可读的,通常建议您对它进行Bas64编码,在这种情况下只需使用该行:

new String(Base64Encoder.encode((md5Digest.digest(DESKTOP_STRING.getBytes()))));

这将为您提供如下内容:ssea19zwO6Jm3AiF4SZmdQ==

请记住,在将其用作md5哈希之前,您需要取消编码

答案 1 :(得分:0)

两种解释都是合理的。其他可能的解释包括:

  • 某些东西(可能是代理服务器)正在改变传输中的内容,
  • 处理字符编码/解码的方式不匹配
  • 实际上是MD5哈希正在被破坏。

您需要收集更多信息以确定它是什么。我建议您修改客户端和服务器端以捕获正在发送/接收的数据到文件中,将它们移动到同一台机器上并进行逐字节比较。您可以尝试的其他事项包括关闭分块和转储/比较两端的MD5校验和。

编辑:如果您发布了在两端进行MD5校验和计算的代码,以及编码/解码校验和以进行传输的代码(例如,使用十六进制, base64或其他)。