当文件上传到服务器时,我们希望获取文件的指纹,以保证文件没有被篡改。常用的算法最初使用的是MD5,随着技术的发展,MD5算法已经被确定为不安全的。目前可以使用更多的HSA3_256哈希算法。哈希算法通常具有以下特点:快如快:原始数据可以快速计算出哈希值逆向难度:基本不可能通过哈希值推导出原始数据输入敏感性:只要原始数据稍有变化,得到的哈希值和哈希值有很大的不同。避免冲突:很难找到不同的原始数据来得到相同的哈希值。哈希算法主要有MD4、MD5、SHA。MD41990年输出128位(已经不安全)MD51991年输出128位(已经不安全)SHA-01993年输出160位(发布后不久被NSA收回,是SHA-1的前身)SHA-11995年,输出了160位(已经不安全)。SHA-2包括SHA-224、SHA-256、SHA-384、SHA-512,分别输出224、256、384、512位。(目前安全)在Java中,可以使用Apache提供的ApacheCommonsCodec非常方便的获取文件的hash字符串指纹。方法也很简单,第一步就是读取文件作为InputStream。如果你自己写,也许这一步就是一点代码。您可以使用Apache提供的FileUtils.openInputStream直接读取文件作为InputStream。考虑以下代码:InputStreamis=FileUtils.openInputStream(newFile(SCOConstants.PATH_DATA_EXCHANGE+"EstimatedvsOriginalManual(JIRA)10-23-20.csv"));MD5hash600px-MD5_algorithm.svg600×65918.4KB你只需要使用DigestUtilsApacheCommonsCodec提供的方法。/***Testtogetfile的MD5Hash**@throwsException*/@TestpublicvoidfileMD5Test()throwsException{Stringmd5=StringUtils.EMPTY;try{InputStreamis=FileUtils.openInputStream(newFile(SCOConstants.PATH_DATA_EXCHANGE+"EstimatedvsOriginalManual(JIRA-)10.cs3"));md5=DigestUtils.md5Hex(is);}catch(Exceptione){e.printStackTrace();}logger.debug("MD5forFile:{}",md5);}以上代码可以直接获取InputStream的MD5hash。程序输出为:09:32:31.522[main]DEBUGc.i.s.c.t.utilities.CodecUtilsTest-MD5forFile:1ec6473fc1bd50a982767f555734af64SHA3256与MD5哈希算法一致。Sha-3_11280×66843KB需要先将文件读取为InputStream,然后使用DigestUtils.sha3_256Hex(is);由阿帕奇提供。考察:/***testTogetFile'sSha3_256HexHash**@throwSexection*/@testpublicvoidfilesha3_256hextest()23-20.csv"));sha3Hex256=DigestUtils.sha3_256Hex(is);}catch(Exceptione){e.printStackTrace();}logger.debug("SHA3_256HexforFile:{}",sha3Hex256);}的输出运行程序For:09:35:48.093[main]DEBUGc.i.s.c.t.utilities.CodecUtilsTest-SHA3_256HexforFile:47ec963787f3acf88747ca7a37ccac9e2cc9b05c87eda1852cb4bc3b0273a431
