代码之家  ›  专栏  ›  技术社区  ›  Pablo Fernandez

大字符串的MD5哈希失败

  •  0
  • Pablo Fernandez  · 技术社区  · 14 年前

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

    这是不是因为尸体的尺寸?或者是因为这些调用返回内容 chunked ?

    任何想法都会很感激。谢谢。

    哈希代码(注意 algorithm == MD5 ENCODING == '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 回复  |  直到 14 年前
        1
  •  2
  •   John Kugelman dbush    14 年前

    如果你包括你的代码那就太好了。没有这些,我只能猜测问题出在哪里。总之,下面是在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散列。

        2
  •  0
  •   Stephen C    14 年前

    两种解释都有道理。其他可能的解释包括:

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

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

    编辑 :如果您发布了在两端执行MD5校验和计算的代码,以及为传输而对校验和进行编码/解码的代码(例如,使用十六进制、base64或其他任何方式),也将帮助我们帮助您。