最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java防止文件被篡改之文件校驗(yàn)功能的實(shí)例代碼

 更新時(shí)間:2018年11月14日 11:14:42   作者:九月長(zhǎng)安  
這篇文章主要介紹了Java防止文件被篡改之文件校驗(yàn)功能,本文給大家分享了文件校驗(yàn)和原理及具體實(shí)現(xiàn)思路,需要的朋友可以參考下

1.為什么要防止文件被篡改?

  答案是顯然的,為了保證版權(quán),系統(tǒng)安全性等。之前公司開發(fā)一個(gè)系統(tǒng),技術(shù)核心是一個(gè)科學(xué)院院士的研究成果,作為一款商業(yè)軟件來說,保證公司及作者版權(quán)是非常重要的。系統(tǒng)安全性就更不用說了,系統(tǒng)兩三下就被搞垮了,那這個(gè)系統(tǒng)就不算是一個(gè)合格的系統(tǒng)。

2.文件校驗(yàn)和作用

         我們都知道,一個(gè)系統(tǒng)或者軟件都是由眾多文件組成的。文件校驗(yàn)和的作用就是保證系統(tǒng)版本的正確性和唯一性。具體原理下面會(huì)詳細(xì)解釋。

3.文件校驗(yàn)和的原理

        思路和實(shí)現(xiàn)的方式可能多種多樣,我說的是自己的思路和實(shí)現(xiàn)方式,請(qǐng)讀者自己斟酌使用。

        原理:主要有兩個(gè)核心:

                1.每個(gè)不同的文件的md5值是不同的

                2.每個(gè)文件被修改后的md5會(huì)發(fā)生改變

4.實(shí)現(xiàn)思路

        1. 拿到系統(tǒng)的根目錄

        2. 采用遞歸,遍歷目錄文件

        3. 計(jì)算每個(gè)文件的md5值 , 并相加。 原因:每個(gè)文件md5值不同,相加后的md5值也必定是唯一。 一個(gè)md5值占32位,4個(gè)字節(jié)。大家都知道,1GB = 1024MB ; 1MB = 1024KB; 1KB=1024B ; 1B = 8bit ; 也就是說就算系統(tǒng)有10000個(gè)文件,10000*4B/1024 = 39KB 。這個(gè)值是遠(yuǎn)遠(yuǎn)小于String的最大值的。String 最大值位2GB左右,本人未親自測(cè)試過,數(shù)據(jù)從網(wǎng)上得來。

        4.所有文件的md5值相加后,得到一個(gè)總的md5值,并且是唯一的。

        5.用戶客戶端啟動(dòng)時(shí),會(huì)先校驗(yàn)文件和,若和服務(wù)器中的校驗(yàn)和不一致,則判定客戶端非法,禁止其一切行為!

        注意:有些文件是一值在改變的,如log日志。故這些一直在變的文件,不應(yīng)該參與文件校驗(yàn)和計(jì)算

5.代碼實(shí)現(xiàn)

校驗(yàn)文件

public class CheckSystemFolderSum {
// 所有文件md5總和
private static String fileSum = "";
/**
* 遍歷文件夾下的所有文件(遞歸) 并對(duì)每個(gè)文件計(jì)算md5值 得到所有文件的md5值之和
* @param file 軟件系統(tǒng)的根文件夾 , suffix 目錄文件后綴(以該后綴結(jié)尾的目錄不會(huì)遍歷和計(jì)算md5值)
* @return 系統(tǒng)所有文件md5之和
*/
public String traverseFolder(File file , String suffix){
if(file == null){
throw new NullPointerException("遍歷路徑為空路徑或非法路徑");
}
if (file.exists()) { //判斷文件或目錄是否存在
File[] files = file.listFiles();
if (files.length == 0) { // 文件夾為空
return null; 
} else {
for (File f : files) { // 遍歷文件夾
if (f.isDirectory()) { // 判斷是否是目錄
if(!(f.getName().endsWith(".no"))){ // 如果不是以.no結(jié)尾的目錄 則計(jì)算該目錄下的文件的md5值
// 遞歸遍歷
traverseFolder(f,suffix); 
}
} else {
// 得到文件的md5值
String string = checkMd5(f);
// 將每個(gè)文件的md5值相加
fileSum+=string;
}
}
}
} else {
return null; // 目錄不存在
}
return fileSum; // 返回所有文件md5值字符串之和
}
計(jì)算文件md5值
/**
* 檢驗(yàn)文件生成唯一的md5值 作用:檢驗(yàn)文件是否已被修改
* @param file 需要檢驗(yàn)的文件
* @return 該文件的md5值
*/
private static String checkMd5(File file) {
// 若輸入的參數(shù)不是一個(gè)文件 則拋出異常
if(!file.isFile()){ 
throw new NumberFormatException("參數(shù)錯(cuò)誤!請(qǐng)輸入校準(zhǔn)文件。");
}
// 定義相關(guān)變量
FileInputStream fis = null;
byte[] rb = null;
DigestInputStream digestInputStream = null;
try {
fis = new FileInputStream(file);
MessageDigest md5 = MessageDigest.getInstance("md5");
digestInputStream = new DigestInputStream(fis,md5);
byte[] buffer = new byte[4096];
while (digestInputStream.read(buffer) > 0);
md5 = digestInputStream.getMessageDigest();
rb = md5.digest();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}finally{
try {
fis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
StringBuilder sb = new StringBuilder();
for (int i = 0; i < rb.length; i++) {
String a = Integer.toHexString(0XFF & rb[i]);
if (a.length() < 2) {
a = '0' + a;
}
sb.append(a);
}
return sb.toString(); //得到md5值
}

測(cè)試

測(cè)試結(jié)果沒有問題。

源碼下載: 請(qǐng)注意,源碼文件的包名涉及隱私已被去除,還有代碼中的地址等需修改。請(qǐng)大家調(diào)試完成后再進(jìn)行測(cè)試!

下載地址:http://xiazai.jb51.net/201811/yuanma/src-java.rar

此代碼只是一個(gè)原理的DEMO,實(shí)際應(yīng)用需要根據(jù)實(shí)際情況做相應(yīng)的調(diào)整!

總結(jié)

以上所述是小編給大家介紹的Java防止文件被篡改之文件校驗(yàn)功能的實(shí)例代碼,希望對(duì)大家有所幫助,如果大家有任何疑問請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!

相關(guān)文章

  • 解決elastic-job-ui在使用druid作為數(shù)據(jù)庫連接池時(shí)作業(yè)維度報(bào)錯(cuò)問題

    解決elastic-job-ui在使用druid作為數(shù)據(jù)庫連接池時(shí)作業(yè)維度報(bào)錯(cuò)問題

    這篇文章主要介紹了解決elastic-job-ui在使用druid作為數(shù)據(jù)庫連接池時(shí)作業(yè)維度報(bào)錯(cuò)問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-04-04
  • CodeGPT + IDEA + DeepSeek如何在IDEA中引入DeepSeek實(shí)現(xiàn)AI智能開發(fā)

    CodeGPT + IDEA + DeepSeek如何在IDEA中引入DeepS

    文章介紹了如何在IDEA中使用CodeGPT和DeepSeek插件實(shí)現(xiàn)AI智能開發(fā),具體內(nèi)容包括安裝步驟、配置APIkey和參數(shù)設(shè)置等,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),感興趣的朋友一起看看吧
    2025-02-02
  • Java動(dòng)態(tài)數(shù)組添加數(shù)據(jù)的方法與應(yīng)用示例

    Java動(dòng)態(tài)數(shù)組添加數(shù)據(jù)的方法與應(yīng)用示例

    這篇文章主要介紹了Java動(dòng)態(tài)數(shù)組添加數(shù)據(jù)的方法,結(jié)合實(shí)例形式詳細(xì)分析了Java動(dòng)態(tài)數(shù)組的創(chuàng)建、添加、查找、打印等相關(guān)操作技巧,需要的朋友可以參考下
    2019-11-11
  • java 開發(fā)使用字符串和數(shù)字的性能分析

    java 開發(fā)使用字符串和數(shù)字的性能分析

    這篇文章主要介紹了java 開發(fā)使用字符串和數(shù)字的性能分析的相關(guān)資料,需要的朋友可以參考下
    2017-07-07
  • java圖片對(duì)比度調(diào)整示例代碼

    java圖片對(duì)比度調(diào)整示例代碼

    這篇文章主要給大家介紹了關(guān)于java圖片對(duì)比度調(diào)整的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用java具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-07-07
  • 一不小心就讓Java開發(fā)踩坑的fail-fast是個(gè)什么鬼?(推薦)

    一不小心就讓Java開發(fā)踩坑的fail-fast是個(gè)什么鬼?(推薦)

    這篇文章主要介紹了Java fail-fast,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-04-04
  • Java中JWT令牌實(shí)現(xiàn)登錄驗(yàn)證

    Java中JWT令牌實(shí)現(xiàn)登錄驗(yàn)證

    本文主要介紹了JWT令牌在Java中實(shí)現(xiàn)登錄驗(yàn)證的方法,JWT是一種自我包含的、無狀態(tài)的認(rèn)證機(jī)制,可以用來在客戶端和服務(wù)器之間傳遞安全可靠的信息,感興趣的可以了解一下
    2024-12-12
  • java實(shí)現(xiàn)操作系統(tǒng)中的最佳置換Optimal算法

    java實(shí)現(xiàn)操作系統(tǒng)中的最佳置換Optimal算法

    這篇文章主要介紹了java實(shí)現(xiàn)操作系統(tǒng)中的最佳置換Optimal算法 ,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-02-02
  • SpringBoot無法識(shí)別bootstrap.yml小綠葉問題的解決辦法

    SpringBoot無法識(shí)別bootstrap.yml小綠葉問題的解決辦法

    一般單獨(dú)使用?Spring?Boot?時(shí),bootstrap.yml?文件一般是不會(huì)生效的,也就是沒有小綠葉圖標(biāo),本文給大家介紹了SpringBoot無法識(shí)別bootstrap.yml小綠葉問題的解決辦法,文中給出了兩種解決方案,需要的朋友可以參考下
    2024-07-07
  • Spring延遲Bean初始化的實(shí)現(xiàn)示例

    Spring延遲Bean初始化的實(shí)現(xiàn)示例

    延遲初始化也叫做惰性初始化,指不提前初始化Bean,而是只有在真正使用時(shí)才創(chuàng)建及初始化Bean,本文主要介紹了Spring延遲Bean初始化的實(shí)現(xiàn)示例,感興趣的可以了解一下
    2024-06-06

最新評(píng)論

伊宁县| 旬阳县| 长岛县| 东城区| 沾化县| 赞皇县| 腾冲县| 仪陇县| 库尔勒市| 开封市| 巴彦淖尔市| 米林县| 平谷区| 池州市| 色达县| 阜城县| 邛崃市| 北宁市| 新绛县| 汪清县| 博白县| 集安市| 拉萨市| 西乌珠穆沁旗| 增城市| 德庆县| 五大连池市| 石泉县| 手游| 阿拉善左旗| 咸宁市| 南涧| 商洛市| 肥城市| 东乡县| 崇义县| 荣成市| 独山县| 甘南县| 元朗区| 栾川县|