java中使用MD5验证文件的完整性

在有关文件上传,下载时为了保证文件的安全和完整性都会考虑到验证文件的完整性操作。

在java中验证文件完整性的算法很多,不过今天我们只介绍一下使用MD5如何验证文件完整性;


    public static void main(String[] args) throws IOException {

 long begin = System.currentTimeMillis();
 
        File file = new File("E:/unicom.sql");
        String md5 = getFileMD5String(file);
        
        //文件名不同,内容相同;
        File file2 = new File("E:/unicom1.txt");
        String md52= getFileMD5String(file2);
        
        File file6 = new File("E:/unicom1.rar");
        String md56= getFileMD5String(file6);
        
        //文件名不同,内容不同;
        File file3 = new File("E:/unicom2.sql");
        String md53= getFileMD5String(file3);
        
      
        //测试压缩包
        File fileZip = new File("E:/mybatis-generator-core-1.3.2(1).zip");
        String md5Zip= getFileMD5String(fileZip);
        
        //测试压缩包
        File fileZip2 = new File("E:/mybatis-generator-core-1.3.2.jar");
        String md5Zip2= getFileMD5String(fileZip2);
           
        System.out.println("MD5:"+md5);
        System.out.println("MD5:"+md52);
        System.out.println("MD5:"+md56);
        System.out.println("MD5:"+md53);
        System.out.println("MD5:"+md5Zip);
        System.out.println("MD5:"+md5Zip2);
        System.out.println("两个文件名不同,内同相同"+ checkPassword(md5, md52));
        System.out.println("文件名不同,内容不同"+ checkPassword(md5, md53));
        System.out.println("测试压缩包,内容不同"+ checkPassword(md5Zip, md5Zip2));

}


输出:

MD5:4d4a4a9a42863f5a1e3e3afb055e0d04
MD5:4d4a4a9a42863f5a1e3e3afb055e0d04
MD5:f7a6626347f8a104f99abb67c3297215
MD5:cad1f74a763045a5fe3d51cfeac23e50
MD5:2021e31fe251d6864dfb333aa58c87e6
MD5:2021e31fe251d6864dfb333aa58c87e6
两个文件名不同,内同相同true
文件名不同,内容不同false
测试压缩包,内容不同true



/**
     * 生成文件的md5校验值
     * 
     * @param file
     * @return
     * @throws IOException
     */
    public static String getFileMD5String(File file) throws IOException {       
        InputStream fis;
        fis = new FileInputStream(file);
        byte[] buffer = new byte[1024];
        int numRead = 0;
        while ((numRead = fis.read(buffer)) > 0) {
            messagedigest.update(buffer, 0, numRead);
        }
        fis.close();
        return bufferToHex(messagedigest.digest());
    }

  private static String bufferToHex(byte bytes[]) {
        return bufferToHex(bytes, 0, bytes.length);
    }

 private static String bufferToHex(byte bytes[], int m, int n) {
        StringBuffer stringbuffer = new StringBuffer(2 * n);
        int k = m + n;
        for (int l = m; l < k; l++) {
            appendHexPair(bytes[l], stringbuffer);
        }
        return stringbuffer.toString();
    }

 /**
     * 默认的密码字符串组合,用来将字节转换成 16 进制表示的字符,apache校验下载的文件的正确性用的就是默认的这个组合
     */
    protected static char hexDigits[] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' };


    private static void appendHexPair(byte bt, StringBuffer stringbuffer) {
        char c0 = hexDigits[(bt & 0xf0) >> 4];// 取字节中高 4 位的数字转换, >>> 为逻辑右移,将符号位一起右移,此处未发现两种符号有何不同 
        char c1 = hexDigits[bt & 0xf];// 取字节中低 4 位的数字转换 
        stringbuffer.append(c0);
        stringbuffer.append(c1);
    }

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Java文件下载通过MD5验证文件传输的完整性,可以通过以下步骤实现: 1. 首先,需要在文件服务器上生成文件MD5校验码。可以使用Java的MessageDigest类来计算文件MD5值。对于要下载的文件,可以使用类似如下的代码来生成其MD5校验码: ```java import java.io.FileInputStream; import java.io.IOException; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; public class MD5Generator { public static String generateMD5(String filePath) throws NoSuchAlgorithmException, IOException { MessageDigest md = MessageDigest.getInstance("MD5"); FileInputStream fis = new FileInputStream(filePath); byte[] buffer = new byte[8192]; int bytesRead; while ((bytesRead = fis.read(buffer)) != -1) { md.update(buffer, 0, bytesRead); } fis.close(); byte[] md5Bytes = md.digest(); StringBuilder sb = new StringBuilder(); for (byte md5Byte : md5Bytes) { sb.append(Integer.toString((md5Byte & 0xff) + 0x100, 16).substring(1)); } return sb.toString(); } } ``` 2. 当客户端下载文件时,在接收到文件并保存到本地之前,可以对文件进行MD5校验。例如,可以使用以下代码进行校验: ```java import java.io.FileInputStream; import java.io.IOException; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; public class FileDownloader { public static void main(String[] args) throws NoSuchAlgorithmException, IOException { String filePath = "path_to_downloaded_file"; String expectedMD5 = "expected_md5_of_downloaded_file"; String downloadedMD5 = MD5Generator.generateMD5(filePath); if (downloadedMD5.equals(expectedMD5)) { System.out.println("文件传输完整,校验通过!"); } else { System.out.println("文件传输存在损坏或被篡改!"); } } } ``` 以上代码会根据下载的文件路径生成其MD5校验码,并将该校验码与预期的MD5值进行比较。如果两者相等,则说明文件传输完整;否则,说明文件传输存在损坏或被篡改。 通过以上步骤,我们可以使用MD5校验码来验证Java文件下载的完整性

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值