java digestutils_java-Apache DigestUtils似乎部分错误地计算了MD5

今晚,我正在研究一种简单的解决方案,以便在流通过时动态进行MD5计算.主要框架可以立即正常运行.数据流化并计算了MD5-hash.但是后来我开始在3个不同阶段监视MD5-Hash.流之前,流之后和流之后.结果令我惊讶.

最重要的MD5摘要显然计算错误.对于所有编码,我都使用了Apache DigestUtils的相同方法.但是我没有产生相同输出的3倍,而是得到了2之3.

为了验证我的构造中没有一般错误,我另外使用了Apache的(…).binary.Hex类对摘要进行编码.这次结果与其他结果匹配.

流之前的MD5:9065793b048f4efee5ccddb34798ee19

流式传输后的MD5:9065793b048f4efee5ccddb34798ee19

由DigestUtils编码的流媒体时的MD5:95d845ff55b5918edc8d1222045dd1cb

二进制编码流式传输时的MD5.十六进制:9065793b048f4efee5ccddb34798ee19

这是我非常简单的代码.

第一类通过main方法开始.

它调用类StreamForwarder的实例并传递测试字符串

作为InputStream.而已.

import java.io.ByteArrayInputStream;

import java.io.InputStream;

import org.apache.commons.codec.digest.DigestUtils;

public class StreamProvider {

private static final byte[] streamContent;

static {

streamContent = "i9BjYXhrIA7FvuQ8WTIhIbgCGwfIGKfu".getBytes();

}

private static InputStream getStreamContent() {

return new ByteArrayInputStream(streamContent);

}

public static void main(String args[]) {

System.out.println("MD5 before streaming: " +

DigestUtils.md5Hex(streamContent));

StreamForwarder streamForwarder = new StreamForwarder();

streamForwarder.forwardStream(getStreamContent());

}

}

StreamForwarder将InputStream封装在DigestInputStream中,并获取MessageDigest的实例以在流式传输时计算MD5-hash.

它调用类StreamConsumer的实例并传递DigestInputStream.

import java.io.InputStream;

import java.security.DigestInputStream;

import java.security.MessageDigest;

import java.security.NoSuchAlgorithmException;

import org.apache.commons.codec.binary.Hex;

import org.apache.commons.codec.digest.DigestUtils;

public class StreamForwarder {

public void forwardStream(InputStream is) throws NoSuchAlgorithmException {

MessageDigest md = MessageDigest.getInstance("MD5");

DigestInputStream dis = new DigestInputStream(is, md);

StreamConsumer streamConsumer = new StreamConsumer();

streamConsumer.printStreamContent(dis);

byte digest[] = md.digest();

String digestUtilsHexString = DigestUtils.md5Hex(digest);

String binaryHexString = new String(Hex.encodeHex(digest));

System.out.println("MD5 while streaming encoded by DigestUtils: " +

digestUtilsHexString);

System.out.println("MD5 while streaming encoded by binary.Hex: " +

binaryHexString);

}

}

最后,StreamConsumer使用Apache的IOUtils读取流.

import java.io.IOException;

import java.io.InputStream;

import org.apache.commons.codec.digest.DigestUtils;

import org.apache.commons.io.IOUtils;

public class StreamConsumer {

public void printStreamContent(InputStream is) throws IOException {

String myString = IOUtils.toString(is, "UTF-8");

System.out.println("MD5 after streaming: " +

DigestUtils.md5Hex(myString.getBytes()));

}

}

如您所见,背后没有火箭科学.但是,仍然没有StreamForwarder.class的输出有关DigestUtils的编码HexString的期望.

有人为我解释为什么会这样吗?我做错什么了吗?

提前致谢!

解决方法:

这行的问题

String digestUtilsHexString = DigestUtils.md5Hex(digest);

您偶尔会计算摘要的摘要-md5hex(md5(is)).您可以用bash进行检查

$echo -n 9065793b048f4efee5ccddb34798ee19 \

| perl -pe 's/([0-9a-f]{2})/chr hex $1/gie' \

| md5sum

95d845ff55b5918edc8d1222045dd1cb -

标签:md5,hash,java

来源: https://codeday.me/bug/20191118/2026800.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值