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
java digestutils_java-Apache DigestUtils似乎部分错误地计算了MD5相关推荐
- JAVA Web项目中所出现错误及解决方式合集(不断更新中)
JAVA Web项目中所出现错误及解决方式合集 前言 一.几个或许会用到的软件下载官网 二.Eclipse的[preferences]下没有[sever]选项 三.Tomcat的安装路径找不到 四.T ...
- 【微信Java开发 --番外篇】错误解析
虽然在微信开发过程中,会有微信公众平台开发者文档中的<全局返回码>作为错误的参考对比:但是依旧的,会觉得有时候的问题莫名其妙.[注:本人使用weixin-java-tools进行开发] 下 ...
- java解析XML saxReader.read(xml) 错误:org.dom4j.DocumentException: no protocol
java解析XML saxReader.read(xml) 错误:org.dom4j.DocumentException: no protocol 完整错误信息: org.dom4j.Document ...
- Java “constant string too long” 编译错误
这个问题是编译时错误,在 Java 的运行时没有这个限制. 当我们在 Java 编译器中输入的变量值超过 64 KB 的话,Java 编译器是不会让编译通过的,你将会得到一个 constant str ...
- Zookeeper Java 客户端 ——Apache Curator
Zookeeper Java 客户端 --Apache Curator 一.基本依赖 二.客户端相关操作 2.1 创建客户端实例 2.2 重试策略 ...
- Java开源Apache项目
Commons-Pool Commons-Pool 提供了通用对象池接口,一个用于创建模块化对象池的工具包,以及通常的对象池实 更多Commons-Pool信息 Commons-Math ...
- Java中常见的50个错误、异常及规避技巧
阐述:在java的开发生涯中,我们总会遇到这样子那样子的异常,有时候花费一天的精力都解决不了,所以总结异常尤为变得重要,也是学习的一种积累经验.下面是我看到别的文章总结的,摘抄出来供打架分享. 编译器 ...
- PHP Apache shutdown unexpectedly启动错误解释及解决的方法
在学PHP的时候,偶然发现XAMPP窗体Apache的启动出现错误,出现下面的错误提示: 9:52:41 [Apache] Attempting to start Apache app... 9:5 ...
- 单击事件开启线程时,再次单击就会出现 java.lang.IllegalThreadStateException: Thread already started. 错误
第一种解决方案:单击事件开启线程时,再次单击就会出现 java.lang.IllegalThreadStateException: Thread already started. 错误 解决办法: 创 ...
最新文章
- MySQL的binarylog处理
- 工资8000以下的程序员注意了:《零coding数据大屏实战宝典.pdf》
- Smali文件添加try/catch语句,出现“invalid use of move-exception”异常
- 服务程序增加系统托盘
- axios请求超时,设置重新请求的完美解决方法
- LoadRunner11录制APP脚本(2)
- Django模板过滤
- c ringbuffer 源码_Python Ring Buffer的实现
- iweboffice 保存成html,金格iweboffice2015使用
- Python + ElasticSearch:轻松玩转跨越千年的两百三十万条地震数据
- 2020大学计算机答案,超星2020大学计算机基础答案 全
- 软件测试工程师怎么写okr,测试工程师提高质量的OKR该如何写?
- 教你用GoldWave进行基础的混音准备
- win10显示隐藏文件_Win10如何隐藏文件 电脑隐藏文件操作方法
- 2019计蒜之道初赛第一场 A 商汤的AI伴游小精灵(DFS)
- JDK1.8 升级这么久!Stream 流的规约操作有哪些?
- UNITY 5.4.0发行说明中文版(不包含bug修正部分)
- jmeter工具进行性能测试
- CF #689(Div. 2) B - Find the Spruce
- 教资有小学计算机吗,小学有没有信息技术教师资格证考试?
热门文章
- 渗透测试报告封面样本
- python爬虫技术路线_爬虫学习——中国大学最好排名(技术路线:requests库和bs4)(来源于北理工Python网络爬虫与信息提取网络公开课)...
- 渲染器跑分_这一次会挤牙膏吗?9400F/10400跑分对比
- 哨兵2号波段_艾略特波段理论分析,A50和恒指走势的蛛丝马迹,完全暴露A股主力意图!...
- Setup Factory打包时实现第三方DLL文件的注册
- Android开发之6.0动态权限工具类(高德地图官方扣出来的)附源码
- mysql change命令_Mysql 操作基本命令大全
- JS(JavaScript)的初了解3(更新中···)
- 搞不清边缘计算几款产品差异?动动小手点这里!
- ( ̄▽ ̄) 关于河北ETC记账卡的默认密码