今晚,我正在研究一种简单的解决方案,以便在流通过时动态进行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. Xilinx FPGA 芯片命名规则与查询方法
  2. mysql的status状态说明
  3. aix 的c库为什么都是静态库_关于AIX  libpthread.a 静态库
  4. zabbix5.2安装-linux
  5. 3、Linux多线程,线程同步(转)
  6. 最长反链(bzoj 1143: [CTSC2008]祭祀river)
  7. 【手写数字识别】基于matlab GUI贝叶斯+线性分类器手写数字识别【含Matlab源码 828期】
  8. ex10_11修改Loan类
  9. 服务器自建云存储,如何搭建私有云?私有云储存服务器NAS搭建方法(轻松搞定)...
  10. 链接形式的客服代码 QQ客服代码
  11. 电平转换小结(避免翻车指南)
  12. Openpose Windows10环境并且是3系显卡+ Unity 环境部署
  13. Java多线程下载分析方法
  14. MPP(大规模并行处理)
  15. 吴恩达深度学习笔记六:序列模型
  16. SQL Server 触发器( trigger ) ------- 用例详解( 你需要举一反三的触发器实用方法都在这了 )
  17. 仲裁器设计(二)-- Round Robin Arbiter 轮询调度算法
  18. 牛客网——歪脖子树下的灯
  19. 深度学习CUDA安装失败及解决方案
  20. go.path/filepath — 兼容操作系统的文件路径操作

热门文章

  1. nmap在kali的使用方法和常见命令(入门)
  2. pcm 采样率转换_PCM编码与Waveform音频文件(.wav)格式详解
  3. mysql 5.8_mysql5.8安装指南
  4. pycharm格式化代码快捷键_你写的 Python 代码总是不规范?用它!
  5. sqlserver循环like变量_numba从入门到精通(6)—numba与循环与并行
  6. vue项目多页面入口配置
  7. linux命令:iptables、modprobe装载模块、网络防火墙服务
  8. Angular定义服务-Learn By Doing
  9. Kafka学习笔记-Java简单操作
  10. Ubuntu 12.04安装英汉词典