使用Java實(shí)現(xiàn)獲取文件MD5值工具類
我們在工作中通常使用MD5對文件進(jìn)行校驗(yàn)完整性,比較,提高安全性等,一般MD5有以下幾種作用
1.數(shù)據(jù)完整性驗(yàn)證:MD5值是通過對文件的內(nèi)容計(jì)算生成的固定長度哈希值。如果文件內(nèi)容發(fā)生任何變化,其MD5值也會(huì)發(fā)生變化。因此,MD5值可以用來驗(yàn)證文件在傳輸或存儲(chǔ)過程中是否發(fā)生了損壞或篡改。這在下載文件、數(shù)據(jù)備份和文件傳輸過程中非常有用。
2.文件比對:在軟件分發(fā)或數(shù)據(jù)交換中,MD5值可以用于驗(yàn)證文件的完整性。例如,開發(fā)人員可以生成文件的MD5值,發(fā)布在網(wǎng)站上,供用戶下載。用戶下載后可以使用相同的方法計(jì)算文件的MD5值,然后與發(fā)布的MD5值進(jìn)行比對,以確保下載的文件沒有被篡改。
3.安全性:MD5值也可以用于存儲(chǔ)用戶密碼的安全性。通常,密碼存儲(chǔ)為其MD5值,而不是明文文本。當(dāng)用戶登錄時(shí),輸入的密碼經(jīng)過MD5哈希后與存儲(chǔ)在數(shù)據(jù)庫中的哈希進(jìn)行比對。這種方式可以增加密碼的安全性,因?yàn)閷?shí)際密碼不會(huì)以明文形式存儲(chǔ)。
4.數(shù)據(jù)重復(fù)檢測:MD5值可以用于檢測文件或數(shù)據(jù)的重復(fù)。如果兩個(gè)文件的MD5值相同,它們的內(nèi)容也是相同的,因此可以用于識(shí)別和刪除重復(fù)數(shù)據(jù)。
總之,獲取文件的MD5值是一種常見的方法,用于驗(yàn)證文件完整性、安全性和數(shù)據(jù)的唯一性。雖然MD5在一些特定情況下已經(jīng)不再被認(rèn)為是足夠安全的哈希算法,但它仍然廣泛用于這些用途,尤其是在文件完整性驗(yàn)證和數(shù)據(jù)校驗(yàn)方面。對于更高級的安全需求,可以考慮使用更安全的哈希算法,如SHA-256
那么如何獲取文件的md5值呢
加依賴
<dependency>
<groupId>commons-codec</groupId>
<artifactId>commons-codec</artifactId>
<version>1.15</version> <!-- 或更高版本 -->
</dependency>
編寫工具類
public class FileMD5Utils {
/**
* 使用Java標(biāo)準(zhǔn)庫的MessageDigest類獲取MD5值
* @param filePath 文件路徑
* @return 文件的md5值
*/
public static String getMD5ByMessageDigest(String filePath) {
try {
MessageDigest md = MessageDigest.getInstance("MD5");
try (InputStream is = new FileInputStream(filePath)) {
byte[] buffer = new byte[8192];
int read;
while ((read = is.read(buffer)) > 0) {
md.update(buffer, 0, read);
}
}
byte[] md5 = md.digest();
StringBuilder result = new StringBuilder();
for (byte b : md5) {
result.append(String.format("%02x", b));
}
return result.toString();
} catch (NoSuchAlgorithmException | IOException e) {
e.printStackTrace();
return null;
}
}
/**
* 使用Apache Commons Codec庫獲取MD5值
* @param filePath 文件路徑
* @return 文件的md5值
*/
public static String getMD5ByApacheCommonsCodec(String filePath) {
try {
return DigestUtils.md5Hex(new FileInputStream(filePath));
} catch (IOException e) {
e.printStackTrace();
return null;
}
}
/**
* 使用Java NIO獲取MD5值
* @param filePath 文件路徑
* @return 文件的md5值
*/
public static String getMD5ByNIO(String filePath) {
try {
Path path = new File(filePath).toPath();
try (InputStream is = java.nio.file.Files.newInputStream(path, StandardOpenOption.READ)) {
MessageDigest md = MessageDigest.getInstance("MD5");
byte[] buffer = new byte[8192];
int read;
while ((read = is.read(buffer)) > 0) {
md.update(buffer, 0, read);
}
byte[] md5 = md.digest();
StringBuilder result = new StringBuilder();
for (byte b : md5) {
result.append(String.format("%02x", b));
}
return result.toString();
}
} catch (NoSuchAlgorithmException | IOException e) {
e.printStackTrace();
return null;
}
}
public static void main(String[] args) {
String filePath = "文件";
String md5ByMessageDigest = getMD5ByMessageDigest(filePath);
System.out.println("MD5 (java MessageDigest 標(biāo)準(zhǔn)庫實(shí)現(xiàn)): " + md5ByMessageDigest);
String md5ByApacheCommonsCodec = getMD5ByApacheCommonsCodec(filePath);
System.out.println("MD5 (Apache Commons Codec 庫實(shí)現(xiàn)): " + md5ByApacheCommonsCodec);
String md5ByNIO = getMD5ByNIO(filePath);
System.out.println("MD5 (Java NIO 實(shí)現(xiàn)): " + md5ByNIO);
}
}到此這篇關(guān)于使用Java實(shí)現(xiàn)獲取文件MD5值工具類的文章就介紹到這了,更多相關(guān)Java獲取文件MD5值內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Spring Boot 使用 WebServiceTemplate 調(diào)用&nbs
文章介紹了使用Spring WebServiceTemplate調(diào)用WebService的方法,包括添加依賴、配置WebServiceTemplate、編寫調(diào)用工具類、注意事項(xiàng)及完整的調(diào)用步驟,特別強(qiáng)調(diào)了調(diào)用.NET的WebService需要添加SOAPAction請求頭,感興趣的朋友跟隨小編一起看看吧2026-03-03
java基于servlet實(shí)現(xiàn)文件上傳功能
這篇文章主要為大家詳細(xì)介紹了java基于servlet實(shí)現(xiàn)文件上傳功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-09-09
SpringBoot結(jié)合Quartz實(shí)現(xiàn)數(shù)據(jù)庫存儲(chǔ)
本文主要介紹了SpringBoot+Quartz+數(shù)據(jù)庫存儲(chǔ),文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-01-01
解決JdbcTemplate查詢時(shí)報(bào)錯(cuò)Incorrect column count: ex
文章描述了在使用JdbcTemplate執(zhí)行查詢時(shí)遇到的`IncorrectResultSetColumnCountException`錯(cuò)誤,原因是`queryForList`方法返回的是`List<Map<String, Object>>`類型,不能直接轉(zhuǎn)換成對象,解決方法是將代碼修改為適當(dāng)?shù)牟樵兎绞?以避免錯(cuò)誤2026-01-01

