java digestutils_java-Apache DigestUtils似乎部分错误地计算了MD5
今晚,我正在研究一種簡(jiǎn)單的解決方案,以便在流通過時(shí)動(dòng)態(tài)進(jìn)行MD5計(jì)算.主要框架可以立即正常運(yùn)行.數(shù)據(jù)流化并計(jì)算了MD5-hash.但是后來我開始在3個(gè)不同階段監(jiān)視MD5-Hash.流之前,流之后和流之后.結(jié)果令我驚訝.
最重要的MD5摘要顯然計(jì)算錯(cuò)誤.對(duì)于所有編碼,我都使用了Apache DigestUtils的相同方法.但是我沒有產(chǎn)生相同輸出的3倍,而是得到了2之3.
為了驗(yàn)證我的構(gòu)造中沒有一般錯(cuò)誤,我另外使用了Apache的(…).binary.Hex類對(duì)摘要進(jìn)行編碼.這次結(jié)果與其他結(jié)果匹配.
流之前的MD5:9065793b048f4efee5ccddb34798ee19
流式傳輸后的MD5:9065793b048f4efee5ccddb34798ee19
由DigestUtils編碼的流媒體時(shí)的MD5:95d845ff55b5918edc8d1222045dd1cb
二進(jìn)制編碼流式傳輸時(shí)的MD5.十六進(jìn)制:9065793b048f4efee5ccddb34798ee19
這是我非常簡(jiǎn)單的代碼.
第一類通過main方法開始.
它調(diào)用類StreamForwarder的實(shí)例并傳遞測(cè)試字符串
作為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的實(shí)例以在流式傳輸時(shí)計(jì)算MD5-hash.
它調(diào)用類StreamConsumer的實(shí)例并傳遞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()));
}
}
如您所見,背后沒有火箭科學(xué).但是,仍然沒有StreamForwarder.class的輸出有關(guān)DigestUtils的編碼HexString的期望.
有人為我解釋為什么會(huì)這樣嗎?我做錯(cuò)什么了嗎?
提前致謝!
解決方法:
這行的問題
String digestUtilsHexString = DigestUtils.md5Hex(digest);
您偶爾會(huì)計(jì)算摘要的摘要-md5hex(md5(is)).您可以用bash進(jìn)行檢查
$echo -n 9065793b048f4efee5ccddb34798ee19 \
| perl -pe 's/([0-9a-f]{2})/chr hex $1/gie' \
| md5sum
95d845ff55b5918edc8d1222045dd1cb -
標(biāo)簽:md5,hash,java
來源: https://codeday.me/bug/20191118/2026800.html
總結(jié)
以上是生活随笔為你收集整理的java digestutils_java-Apache DigestUtils似乎部分错误地计算了MD5的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java 403怎么抛出_django主
- 下一篇: php5 php4,自动实现php4和p