Java防止文件篡改之文件校验和

Java防止文件被篡改之文件校验和

转载:请注明出处,谢谢!

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

  答案是显然的,为了保证版权,系统安全性等。之前公司开发一个系统,技术核心是一个科学院院士的研究成果,作为一款商业软件来说,保证公司及作者版权是非常重要的。系统安全性就更不用说了,系统两三下就被搞垮了,那这个系统就不算是一个合格的系统。

2.文件校验和作用

         我们都知道,一个系统或者软件都是由众多文件组成的。文件校验和的作用就是保证系统版本的正确性和唯一性。具体原理下面会详细解释。

3.文件校验和的原理

        思路和实现的方式可能多种多样,我说的是自己的思路和实现方式,请读者自己斟酌使用。

        原理主要有两个核心

                1.每个不同的文件的md5值是不同的

                2.每个文件被修改后的md5会发生改变

4.实现思路

        1. 拿到系统的根目录

        2. 采用递归,遍历目录文件

        3. 计算每个文件的md5值 , 并相加。 原因:每个文件md5值不同,相加后的md5值也必定是唯一。 一个md5值占32位,4个字节。大家都知道,1GB = 1024MB ; 1MB = 1024KB; 1KB=1024B ; 1B = 8bit ; 也就是说就算系统有10000个文件,10000*4B/1024 = 39KB 。这个值是远远小于String的最大值的。String 最大值位2GB左右,本人未亲自测试过,数据从网上得来。

        4.所有文件的md5值相加后,得到一个总的md5值,并且是唯一的。

        5.用户客户端启动时,会先校验文件和,若和服务器中的校验和不一致,则判定客户端非法,禁止其一切行为!

        注意:有些文件是一值在改变的,如log日志。故这些一直在变的文件,不应该参与文件校验和计算

5.代码实现

校验文件

public class CheckSystemFolderSum {
	
	// 所有文件md5总和
	private static String fileSum = "";
	
	/**
	 *  遍历文件夹下的所有文件(递归) 并对每个文件计算md5值 得到所有文件的md5值之和
	 * @param  file 软件系统的根文件夹   , suffix 目录文件后缀(以该后缀结尾的目录不会遍历和计算md5值)
	 * @return 		系统所有文件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结尾的目录 则计算该目录下的文件的md5值
                    		
                        	// 递归遍历
                            traverseFolder(f,suffix); 
                    	}
                    
                    } else {
                    	// 得到文件的md5值
                        String string = checkMd5(f);
                        // 将每个文件的md5值相加
                        fileSum+=string;
                    }
                }
            }
            
        } else {
            return null; // 目录不存在
        }
		
        return fileSum; // 返回所有文件md5值字符串之和
	}

计算文件md5值

/**
	 * 检验文件生成唯一的md5值       作用:检验文件是否已被修改
	 * @param file 需要检验的文件
	 * @return	        该文件的md5值
	 */
	private static String checkMd5(File file) {

		// 若输入的参数不是一个文件 则抛出异常
		if(!file.isFile()){ 
			throw new NumberFormatException("参数错误!请输入校准文件。");
		}
		
		// 定义相关变量
        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值
    }

测试

测试结果没有问题。

源码下载: 请注意,源码文件的包名涉及隐私已被去除,还有代码中的地址等需修改。请大家调试完成后再进行测试!

下载地址:https://download.csdn.net/download/javabuilt/10291183

更新一波:用swing写了一个计算文件校验和工具

工具使用:

输入文件夹地址,输入不查校验和数组(如果有则填写,以逗号分割)

注意: 本工具默认不查 .properties文件校验和! 请勿作为商业用途!

工具下载地址:https://download.csdn.net/download/javabuilt/11435080

  • 1
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
使用encrypt care加密工具生成文件校验和步骤: 1. 打开encrypt care加密工具,选择“Hash”的功能。 2. 点击 “Add File” 或者 “Add Folder”按钮选择要计算校验和文件或者文件夹。如果需要计算连续文件校验和,你可以选择“Add File”按钮。 3. 一旦你选择了文件文件夹,点击“Start”按钮,程序会计算文件校验和,计算结束后校验和会显示在主窗口中。 4. 校验和可以用于验证文件本身是否被篡改。如果文件在传输和存储期间被修改,它的校验和也将更改。验证文件校验和可以确定文件的完整性是否得到了维护。 验证文件校验和步骤: 1. 打开encrypt care加密工具,选择“Hash”的功能。 2. 点击“Verify”按钮,选择你要验证的文件或者文件夹(包含校验和的文本文件) 3. 一旦你选择了文件文件夹,点击“Start”按钮,程序将重新计算文件校验和,并与原始校验和进行比较。 4. 如果计算出的校验和与原始校验和不同,说明文件有被篡改的可能性,如果计算出的校验和与原始校验和相同,则文件的完整性没有被破坏。 注意事项: 为了确保校验和的正确性,必须对原始文件校验和本身进行适当的保护和存储。最好将校验和存储在另一个设备或媒体上,以防止在同一个设备或媒体上出现故障的情况下丢失或损坏校验和

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值