我正在制作响应的MD5哈希值,然后使用共享密钥对其进行签名。
对于大多数调用来说,这是有效的,但奇怪的是失败(生成与客户端不同的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);
}
}
答案 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校验和计算的代码,以及编码/解码校验和以进行传输的代码(例如,使用十六进制, base64或其他)。