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的几种方法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java集合体检套餐管理系统_基于ssm
- 下一篇: python中函数不包括参数函数二阶导数