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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

java 文件checksum_计算文件Checksum的几种方法

發布時間:2024/3/24 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java 文件checksum_计算文件Checksum的几种方法 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

回憶一下,自己是否在網站上下載文件時看到過Checksum這個東西,一串字符串?

比如,我們到Apache網站上去下載用于操作Excel的依賴包 - Apache POI,就可以看到checksum:SHA-256,?SHA-512, 如下圖所示:

以poi-bin-4.1.0-20190412.tar.gz文件為例,點擊SHA-256和SHA-512的鏈接查看相關的值如下:

##SHA-256的值d8db4f8228d87935ca46b0af72db68ad83f45b31d885e67b089d195b5ee800bb##SHA-512的值87499ab94882605ee2f407fc66e24c613ae98896b8d5f527b6cd8c604574922fc72d148da42962b2ee30ad18cd712e3de42bfe14770261b07217717c52a738a9

本文將簡單介紹一下checksum(含義,作用)以及如何使用java程序計算出不同算法的checksum值,包括MD5、SHA-1,SHA-256以及SHA-512。Checksum:總和檢驗碼,校驗和。在數據處理和數據通信領域中,用于校驗目的的一組數據項的和。這些數據項可

以是數字或在計算檢驗總和過程中看作數字的其它字符串。通常是以十六進制為數制表示的形式。

【作用】就是用于檢查文件完整性,檢測文件是否被惡意篡改,比如文件傳輸(如插件、固件升級包等)場景使用。

接下來,我們一起看下怎么使用java程序產生相關的checksum值,本文以文件poi-bin-4.1.0-20190412.tar.gz為例,具體可以通過如下路徑下載:http://mirror.bit.edu.cn/apache/poi/release/bin/poi-bin-4.1.0-20190412.tar.gz

因為要使用不同算法的checksum值,包括MD5、SHA-1,SHA-256以及SHA-512,先定義一個枚舉類,用于區分不同的算法。package?com.wangmengjun.tutorial.checksum;

public?enum?CheckSumAlgoType?{

MD5("MD5"),?SHA_256("SHA-256"),?SHA_512("SHA-512"),?SHA_1("SHA1");

private?String?name;

private?CheckSumAlgoType(String?name)?{

this.name?=?name;

}

public?String?getName()?{????return?name;??}

public?void?setName(String?name)?{????this.name?=?name;??}

}

接下來,我們就來看看幾種計算文件checksum的方法:使用java.security.MessageDigest

使用org.apache.commons.codec.digest.DigestUtils

使用com.google.common.io.Files.hash

一、使用java.security.MessageDigestpublic?static?String?genChecksum1(File?file,?String?checkSumAlgo)?throws?NoSuchAlgorithmException,?IOException?{

MessageDigest?messageDigest?=?MessageDigest.getInstance(checkSumAlgo);

messageDigest.update(Files.readAllBytes(file.toPath()));

byte[]?digestBytes?=?messageDigest.digest();

StringBuffer?sb?=?new?StringBuffer();

for?(byte?b?:?digestBytes)?{

sb.append(Integer.toString((b?&?0xff)?+?0x100,?16).substring(1));

}

return?sb.toString();

}

其中,下面的這段代碼,StringBuffer?sb?=?new?StringBuffer();

for?(byte?b?:?digestBytes)?{

sb.append(Integer.toString((b?&?0xff)?+?0x100,?16).substring(1));

}

return?sb.toString();

可以使用javax.xml.bind.DatatypeConverter的方法來做,簡化后的代碼如下:public?static?String?genChecksum1(File?file,?String?checkSumAlgo)?throws?NoSuchAlgorithmException,?IOException?{

MessageDigest?messageDigest?=?MessageDigest.getInstance(checkSumAlgo);

messageDigest.update(Files.readAllBytes(file.toPath()));

byte[]?digestBytes?=?messageDigest.digest();

return?DatatypeConverter.printHexBinary(digestBytes).toLowerCase();

}????因為,DatatypeConverter.printHexBinary(digestBytes)返回的字符大寫,所以添加了toLowerCase()方法保持其一致性。

二、使用org.apache.commons.codec.digest.DigestUtils

使用commons-codec來完成,Maven工程需要添加依賴包,如:

commons-codec

commons-codec

1.13

簡單代碼如下,通過調用類DigestUtils的靜態方法完成指定checksum的計算即可:public?static?String?genChecksum2(File?file,?CheckSumAlgoType?checkSumAlgoType)??????throws?FileNotFoundException,?IOException?{

/**?????*?使用org.apache.commons.codec.digest.DigestUtils?????*/

String?checksum?=?null;

switch?(checkSumAlgoType)?{

case?MD5:

checksum?=?DigestUtils.md5Hex(new?FileInputStream(file));

break;

case?SHA_1:

checksum?=?DigestUtils.sha1Hex(new?FileInputStream(file));

break;

case?SHA_256:

checksum?=?DigestUtils.sha256Hex(new?FileInputStream(file));

break;

case?SHA_512:

checksum?=?DigestUtils.sha512Hex(new?FileInputStream(file));

break;

default:

checksum?=?DigestUtils.md5Hex(new?FileInputStream(file));

}

return?checksum;

}

三、使用com.google.common.io.Files.hash

使用Guava來完成,Maven工程需要添加依賴包,如:

com.google.guava

guava

23.0

簡單代碼如下,通過調用com.google.common.io.Files的hash方法即可:public?static?String?genChecksum3(File?file,?CheckSumAlgoType?checkSumAlgoType)?throws?IOException?{

/**?????*?使用Guava?????*/

String?checksum?=?null;

switch?(checkSumAlgoType)?{

case?MD5:

checksum?=?com.google.common.io.Files.hash(file,?Hashing.md5()).toString();

break;

case?SHA_1:

checksum?=?com.google.common.io.Files.hash(file,?Hashing.sha1()).toString();

break;

case?SHA_256:

checksum?=?com.google.common.io.Files.hash(file,?Hashing.sha256()).toString();

break;

case?SHA_512:

checksum?=?com.google.common.io.Files.hash(file,?Hashing.sha512()).toString();

break;

default:

checksum?=?com.google.common.io.Files.hash(file,?Hashing.md5()).toString();

}

return?checksum;

}

驗證

最后,我們一起來驗證一下上述幾種方法對文件的checksum計算。public?static?void?main(String[]?args)?throws?NoSuchAlgorithmException,?IOException?{

File?file?=?new?File("/users/wmj/Downloads/poi-bin-4.1.0-20190412.tar.gz");

for?(CheckSumAlgoType?type?:?CheckSumAlgoType.values())?{

System.out.println("采用"?+?type.getName()?+?"計算checksum");

System.out.println(??????????String.format("method=%s,checksum=%s",?"genChecksum1",?genChecksum1(file,?type.getName())));

System.out.println(String.format("method=%s,checksum=%s",?"genChecksum2",?genChecksum2(file,?type)));

System.out.println(String.format("method=%s,checksum=%s",?"genChecksum3",?genChecksum3(file,?type)));

System.out.println();

}

}

運行結果如下:

采用MD5計算checksummethod=genChecksum1,checksum=2fa39c79790c29c53368ec0c14fdea97method=genChecksum2,checksum=2fa39c79790c29c53368ec0c14fdea97method=genChecksum3,checksum=2fa39c79790c29c53368ec0c14fdea97采用SHA-256計算checksummethod=genChecksum1,checksum=d8db4f8228d87935ca46b0af72db68ad83f45b31d885e67b089d195b5ee800bbmethod=genChecksum2,checksum=d8db4f8228d87935ca46b0af72db68ad83f45b31d885e67b089d195b5ee800bbmethod=genChecksum3,checksum=d8db4f8228d87935ca46b0af72db68ad83f45b31d885e67b089d195b5ee800bb采用SHA-512計算checksummethod=genChecksum1,checksum=87499ab94882605ee2f407fc66e24c613ae98896b8d5f527b6cd8c604574922fc72d148da42962b2ee30ad18cd712e3de42bfe14770261b07217717c52a738a9method=genChecksum2,checksum=87499ab94882605ee2f407fc66e24c613ae98896b8d5f527b6cd8c604574922fc72d148da42962b2ee30ad18cd712e3de42bfe14770261b07217717c52a738a9method=genChecksum3,checksum=87499ab94882605ee2f407fc66e24c613ae98896b8d5f527b6cd8c604574922fc72d148da42962b2ee30ad18cd712e3de42bfe14770261b07217717c52a738a9采用SHA1計算checksummethod=genChecksum1,checksum=f56e42474fa81676d82a38ae6a8df67194a50b93method=genChecksum2,checksum=f56e42474fa81676d82a38ae6a8df67194a50b93method=genChecksum3,checksum=f56e42474fa81676d82a38ae6a8df67194a50b93

我們可以看到,計算結果和Apache上顯示的checksum是一致的。

本文主要給出了三種計算checksum的方式,包括:

使用java.security.MessageDigest

使用org.apache.commons.codec.digest.DigestUtils

使用com.google.common.io.Files.hash

當然,可能還有其它的實現方式和工具包,如果讀者發現其它的也可以同步一下,一起學習。

總結

以上是生活随笔為你收集整理的java 文件checksum_计算文件Checksum的几种方法的全部內容,希望文章能夠幫你解決所遇到的問題。

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