日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

發布時間:2023/12/15 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。