今晚,我正在研究一种简单的解决方案,以便在流通过时动态进行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相关推荐

  1. JAVA Web项目中所出现错误及解决方式合集(不断更新中)

    JAVA Web项目中所出现错误及解决方式合集 前言 一.几个或许会用到的软件下载官网 二.Eclipse的[preferences]下没有[sever]选项 三.Tomcat的安装路径找不到 四.T ...

  2. 【微信Java开发 --番外篇】错误解析

    虽然在微信开发过程中,会有微信公众平台开发者文档中的<全局返回码>作为错误的参考对比:但是依旧的,会觉得有时候的问题莫名其妙.[注:本人使用weixin-java-tools进行开发] 下 ...

  3. java解析XML saxReader.read(xml) 错误:org.dom4j.DocumentException: no protocol

    java解析XML saxReader.read(xml) 错误:org.dom4j.DocumentException: no protocol 完整错误信息: org.dom4j.Document ...

  4. Java “constant string too long” 编译错误

    这个问题是编译时错误,在 Java 的运行时没有这个限制. 当我们在 Java 编译器中输入的变量值超过 64 KB 的话,Java 编译器是不会让编译通过的,你将会得到一个 constant str ...

  5. Zookeeper Java 客户端 ——Apache Curator

    Zookeeper Java 客户端 --Apache Curator 一.基本依赖 二.客户端相关操作          2.1 创建客户端实例          2.2 重试策略          ...

  6. Java开源Apache项目

      Commons-Pool  Commons-Pool 提供了通用对象池接口,一个用于创建模块化对象池的工具包,以及通常的对象池实 更多Commons-Pool信息   Commons-Math  ...

  7. Java中常见的50个错误、异常及规避技巧

    阐述:在java的开发生涯中,我们总会遇到这样子那样子的异常,有时候花费一天的精力都解决不了,所以总结异常尤为变得重要,也是学习的一种积累经验.下面是我看到别的文章总结的,摘抄出来供打架分享. 编译器 ...

  8. PHP Apache shutdown unexpectedly启动错误解释及解决的方法

    在学PHP的时候,偶然发现XAMPP窗体Apache的启动出现错误,出现下面的错误提示: 9:52:41  [Apache] Attempting to start Apache app... 9:5 ...

  9. 单击事件开启线程时,再次单击就会出现 java.lang.IllegalThreadStateException: Thread already started. 错误

    第一种解决方案:单击事件开启线程时,再次单击就会出现 java.lang.IllegalThreadStateException: Thread already started. 错误 解决办法: 创 ...

最新文章

  1. MySQL的binarylog处理
  2. 工资8000以下的程序员注意了:《零coding数据大屏实战宝典.pdf》
  3. Smali文件添加try/catch语句,出现“invalid use of move-exception”异常
  4. 服务程序增加系统托盘
  5. axios请求超时,设置重新请求的完美解决方法
  6. LoadRunner11录制APP脚本(2)
  7. Django模板过滤
  8. c ringbuffer 源码_Python Ring Buffer的实现
  9. iweboffice 保存成html,金格iweboffice2015使用
  10. Python + ElasticSearch:轻松玩转跨越千年的两百三十万条地震数据
  11. 2020大学计算机答案,超星2020大学计算机基础答案 全
  12. 软件测试工程师怎么写okr,测试工程师提高质量的OKR该如何写?
  13. 教你用GoldWave进行基础的混音准备
  14. win10显示隐藏文件_Win10如何隐藏文件 电脑隐藏文件操作方法
  15. 2019计蒜之道初赛第一场 A 商汤的AI伴游小精灵(DFS)
  16. JDK1.8 升级这么久!Stream 流的规约操作有哪些?
  17. UNITY 5.4.0发行说明中文版(不包含bug修正部分)
  18. jmeter工具进行性能测试
  19. CF #689(Div. 2) B - Find the Spruce
  20. 教资有小学计算机吗,小学有没有信息技术教师资格证考试?

热门文章

  1. 渗透测试报告封面样本
  2. python爬虫技术路线_爬虫学习——中国大学最好排名(技术路线:requests库和bs4)(来源于北理工Python网络爬虫与信息提取网络公开课)...
  3. 渲染器跑分_这一次会挤牙膏吗?9400F/10400跑分对比
  4. 哨兵2号波段_艾略特波段理论分析,A50和恒指走势的蛛丝马迹,完全暴露A股主力意图!...
  5. Setup Factory打包时实现第三方DLL文件的注册
  6. Android开发之6.0动态权限工具类(高德地图官方扣出来的)附源码
  7. mysql change命令_Mysql 操作基本命令大全
  8. JS(JavaScript)的初了解3(更新中···)
  9. 搞不清边缘计算几款产品差异?动动小手点这里!
  10. ( ̄▽ ̄) 关于河北ETC记账卡的默认密码