文件下载时前后台MD5校验

js前端md5加密生成校验位,.net后端进行校验完整性 突然有个安全性的要求,前端和后端数据交互要验证完整性,防止篡改,我就使用表单数据拼接然后生成校验位,到了服务器端再用同样办法进行校验位验证,弄了半天发现前后端生成的md5字符串总是不一样。找了好多终于解决了 1.前端 js  下面是md5.js文件 /* * A JavaScript implementation of the RSA Data Security, Inc. 阅读详情

背景

在项目中发现,文件下载时有可能出现文件不完全导致的文件无法打开的情况,考虑在后台响应中加入文件MD5,与前台取得文件后生成的MD5值作一次校验,来判断文件是否正确下载。

问题

此功能的难点是如何在response中加入MD5值。原文件下载接口中使用的是HttpServletResponse,然后在前台使用a标签的点击事件来实现,在开发过程中,首先想到的是在response的headers中加入MD5信息,然后在前台想办法取到,即



// response.setHeader("md5",md5sum(bytes));

private String md5sum(byte[] bytes){

  

}

在实际开发中发现,这个方法无法正常下载文件,所以应该通过其他途径来实现。(这种想法还是很天真的2333)

方案

之前的开发中有用到Blob对象,在前台中可以使用Blob对象来实现文件下载,即

var url = window.URL.createObjectURL(blob);

var a = document.createElement('a');

a.href = url;

a.download = filename;

a.click();

那么肯定可以在后台接口中加上文件的bytearray,再在JS中使用var blob = new Blob([bytearray]);来声明一个blob对象实现文件下载,那么也可以在返回的JSON中加入生成的MD5值了。

代码

后台

import org.apache.commons.io.IOUtils;

import java.util.HashMap;

import java.util.Map;

import java.io.*;

import java.security.MessageDigest;

    private final char HEX_DIGITS[] = {'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};


    @Override

    public Object downloadFile(String burketName, String fileName){

        try {

            InputStream is = ...;

            byte[] byteArray = IOUtils.toByteArray(is);

            String fileMD5 = md5sum(byteArray);

            Map map = new HashMap();

            map.put("file",byteArray);

            map.put("md5",fileMD5.toUpperCase());


            if(is!=null){

                is.close();

            }

            return map;

        }catch (Exception ex){

            ex.printStackTrace();

        }

        return "";

    }


    private String toHexString(byte[] b) {

        StringBuilder sb = new StringBuilder(b.length * 2);

        for (int i = 0; i < b.length; i++) {

            sb.append(HEX_DIGITS[(b[i] & 0xf0) >>> 4]);

            sb.append(HEX_DIGITS[b[i] & 0x0f]);

        }

        return sb.toString();

    }


    private String md5sum(byte[] byteArray) {

        InputStream is = new ByteArrayInputStream(byteArray);

        byte[] buffer = new byte[1024];

        int numRead = 0;

        MessageDigest md5;

        try{

            md5 = MessageDigest.getInstance("MD5");

            while((numRead=is.read(buffer)) > 0) {

                md5.update(buffer,0,numRead);

            }

            return toHexString(md5.digest());

        } catch (Exception e) {

            System.out.println("parse md5 error");

            return null;

        }

    }

 

前台

// 前台在生成MD5时使用了SparkMD5插件

fetch(url, {headers:headers).then(function (res) {

    return res.json();

}).then(function (blob) {

    var spark = new SparkMD5.ArrayBuffer();

    //这个是接口中返回的MD5

    var serverMD5=blob.md5;

    var byteBuffer=_base64ToArrayBuffer(blob.file);

    spark.append(byteBuffer);

    var clientMD5 = spark.end().toUpperCase();

    // 判断文件是否下载完全

    if(serverMD5 === clientMD5){

        var f = new Blob([byteBuffer]);

        var url = window.URL.createObjectURL(f);

        var a = document.createElement('a');

        a.href = url;

        a.download =filename;

        a.click();

        window.URL.revokeObjectURL(f);

    }

    else{

        console.log("文件下载时出错,请重新下载");

    }

});


function _base64ToArrayBuffer (base64) {

    var binary_string =  window.atob(base64);

    var len = binary_string.length;

    var bytes = new Uint8Array(len);

    for (var i=0;i<len;i++) {

        bytes[i] = binary_string.charCodeAt(i);

    }

    return bytes.buffer;

}

总结

以上就是在开发文件下载校验时的思路和代码分享,开发的关键就是在文件下载接口返回值中加入后台计算的文件MD5,主要就是通过后台接口中返回文件的bytearray和用作校验的MD5值,前台接收到接口返回后生成一个MD5来与接口返回的MD5作校验,再在前台中使用返回的bytearray,通过Blob来实现文件下载。

如果你还有更好的方案,欢迎给我留言,不胜感激。

传送门

如何在 CMD 窗口中校验文件的 MD5 值 MD5(Message Digest Algorithm 5)是一种广泛使用的哈希算法,它可以将任意长度的数据映射为一个128位的哈希值(也称为散列值)。MD5 校验主要用于验证文件的一致性和完整性。通过比对下载文件的 MD5 值和源文件的 MD5 值,可以确认文件是否被篡改。 阅读详情

相关推荐

文件MD5校验码的安全性及重要性

文件MD5是一种常用的验证文件完整性和安全性的工具。通过计算文件的MD5值,可以验证文件是否完整、防止文件被篡改,并保护数据的安全性。计算和验证文件MD5值可以通过各种方式实现,同时需要注意保护MD5值的安全性和定期验证文件的完整性。通过了解文件MD5的原理和应用场景,读者可以更好地应用这一工具,保障文件的完整性和安全性。

https://blog.cmdragon.cn/ 1673

php文件上传MD5完整性验证方案实例【包含上传及下载方法】

需求背景 由于设置的参数数据过多,以至于设备出厂后用户根据说明书设置数据比较繁琐。因此导入配置数据导入导出需求; 首先配置一台设备的配置参数,等该设备所有参数配置完成后,将此设备的设备参数以数据包.tar的形式导出; 再将数据包.tar导入进其他设备机器,一键自动设置相同参数。 技术重点与难点 功能1:配置参数以.tar数据包的形式从设备导出 功能2:配置参数以.tar数据包的形式从设备导入...

fq_fly的博客 1102

MD5文件校验

最近一个项目,需要做OTA远程升级,MCU从服务器下载升级文件到本地,进行程序升级。本来如果使用TPC/IP协议传输数据(升级文件)的话,可以不进行文件校验,因为TCP/IP数据传输的时候,为了保证数据的正确性,TCP/IP会进行数据校验。也就是说,我们通过TCP/IP协议接受的数据包,是不需要再次进行校验的。但是这个项目,使用了移远的串口-GPRS模块。MCU通过串口发送AT指...

peijian1998的专栏 2542

快速计算文件的MD5/SHA1/SHA256等校验值(Windows/Linux)

从网络上下载文件,尤其是非常大的文件怎么确保文件准确无误呢?通常网站提供文件时会同时提供该文件的校验值,如MD5,SHA1,SHA256等,当文件下载完成后,计算它的校验值,如果和网站提供的一致,就可以放心使用了。Windows 使用命令行计算校验值在命令行下,可以使用Windows自带的certutil命令来计算一个文件的校验值:certutil支持的算法有:MD2 MD4 MD5 SHA1 S...

xkwy100's Blog 9万+

PHP 文件校验 文件的 MD5 散列值

PHP   MD5 散列值 应用场景: 1、校验文件的完整性       可用于服务器文件的备份处理。 2、检验文件的重复性      去除服务器上传文件的重复,占用额外空间的问题。 3、校验文件是否被篡改   下载网站,多会放置MD5校验码,用于校验文件。 PHP校验代码 <?php /** * Created by PhpStorm. * User: kungyu *

kung的专栏 4795

用Python校验下载文件的完整性(md5),游戏之类的大型文件

对于大的文件,比如大型游戏,下载一般会带有md5值在下载包里面,md5是一种加密手段,在这里可以用来验证完整性,因为在下载大型文件的时候某个部分可能网络传输会出现错误,一个小文件坏了可能会导致游戏玩到中间出意外的bug或者干脆打不开游戏,重新下载要花费很多时间,所以还是值得下好先验证一下的。直接上代码 import hashlib import os f_path = input('Fil...

python_neophyte的博客 2262

文件传输中的MD5校验技术

通过计算文件的MD5哈希值,接收方可以与发送方共享的哈希值进行比较,以确保文件的完整性。接收方使用相同的MD5算法对接收到的文件进行哈希计算,并将得到的哈希值与发送方的哈希值进行比较。接收方在接收到文件后,使用相同的MD5算法计算文件的哈希值,并将得到的哈希值与发送方的哈希值进行比较。用户在下载软件时,可以通过计算下载文件的MD5哈希值,并与发布的哈希值进行比较,以验证下载文件的完整性。当软件发布更新时,用户可以通过计算更新文件的MD5哈希值,并与发布的哈希值进行比较,以确保更新文件的完整性。

https://blog.cmdragon.cn/ 2946

MD5文件校验工具:原理与应用

本文还有配套的精品资源,点击获取 简介:MD5是一种用于数据完整性校验和加密的哈希函数,广泛应用于IT行业中验证文件的完整性和一致性。"文件MD5工具"软件简化了计算和比较文件MD5值的过程,通过生成的唯一哈希值(“指纹”)检测文件是否被篡改。尽管MD5具有一定的安全性限制,它依旧在很多场景下作为校验手段使用。本文将介绍MD5的工作原理、使用方法及在实际应用中应注意的安全问...

weixin_36047538的博客 4166

【工具分享】免安装 MD5 码校验工具:Md5Checker

Md5Checker 工具推荐

qq_60282366的博客 1万+

MD5校验器:文件完整性验证实用工具

本文还有配套的精品资源,点击获取 简介:MD5校验器是一个简单但极其重要的工具,用于验证文件的完整性和一致性。MD5是一种广泛采用的哈希函数,通过生成一个独特的128位哈希值来识别文件内容。用户可以通过比对原始文件和新位置文件的MD5值来确保文件未被篡改。此工具在软件分发、数据备份和恢复等场景中极为有用。尽管MD5在安全性方面存在局限,但在不需要严格安全措施的环境中,它依然...

weixin_42601608的博客 1万+

前端加密插件md5.js

前端加密插件md5.js MD5.js是对前端的明文数据进行MD5加密方式。是一个前端加密插件。 MD5信息摘要算法(英语:MD5 Message-Digest Algorithm),一种被广泛使用的密码散列函数,可以产生出一个128位(16字节)的散列值(hash value),用于确保信息传输完整一致。MD5由美国密码学家罗纳德·李维斯特(Ronald Linn Rivest)设计,于1992年公开,用以取代MD4算法。这套算法的程序在 RFC 1321 标准中被加以规范。1996年后该算法被证实存在弱点,可以被加以破解,对于需要高度安全性的数据,专家一般建议改用其他算法,如SHA-2。2004年,证实MD5算法无法防止碰撞(collision),因此不适用于安全性认证,如SSL公开密钥认证或是数字签名等用途。

基于STM32的MD5校验

我们在嵌入式及单片机的产品开发时,往往需要对一些文件进行检验,来保证此文件是在传输的过程没有被修改或者损坏。比如IAP升级程序时,往往就需要对升级固件进行校验。MD5是其中非常常用的一种检验方式。本文通过使用MD5检验程序,对STM32的Flash中的某一段数据进行检验,检验后存放到字符串里,可用来比对或者输出。......

5143

MD5.js 前端MD5加密

MD5.js,JavaScript一种直译式脚本语言,是一种动态类型、弱类型、基于原型的语言,内置支持类型,网络上找的MD5.js资源,跟大家共享,有需要的赶快下载吧!

python中md5文件校验

转自:http://www.cnblogs.com/PandaBamboo/archive/2013/05/10/3071233.html 好久没有写随笔了,正好这两天可以休整一下,借此机会总结下最近使用python的小体会。     个人体会文件校验在下载文件时使用较多,在linux下最简单的实现方式就是: 1 $ md5sum filename 2 21c7ee192

Hello World! 1万+

MRI多序列,多中心数据集预处理--使用FSL-Flirt 配准数据

FLIRT(FMRIB 的线性图像配准工具)是用于线性(仿射)模态内和模态间脑图像配准的全自动稳健且准确的工具。 什么是配准 在这两张图片上,很容易看出它们没有对齐,左边相对右边倾斜,虽然我们人类视觉系统还是能把对应的解剖关系连系在一起,但是我们使用计算机分析时确不能够 因此,我们希望相同的解剖结构对齐,用坐标表示的话,希望他们在相同的坐标上。如下图 对齐这些解剖结构的过程就叫做配准(register) 因此,配准的目的也是使相同的解剖结构在同一个位置,便于分析。可以将CT和MRI配准,看同一结构在两个

Tina姐的博客 1万+

KANO分析模型

KANO分析模型的基本概念,目的意义,应用场景,实现方法和示例等

JasonH2021的博客 3065

C# MD5文件校验

由于诸多安全因素,需要对网上下载的一些文件进行完整性校验。比如,由于工作需要我下载了一个EMOS_1.5_i386.iso镜像文件(extmail邮件系统),需要对其进行MD5校验。为此,用C# 2005写了一个获取文件MD5码的简单程序。        用MD5进行文件校验,

wdspringrain的专栏 6224

PaddleOCR实战:从零开始训练自己的OCR模型(附完整代码与数据集处理技巧)

本文提供了一份详尽的PaddleOCR实战指南,手把手教你从零开始训练专属的OCR模型。内容涵盖高质量训练数据的准备与标注技巧、预训练模型的选型对比、关键参数调优策略,并附有完整的代码示例。通过遵循本文的步骤,开发者可以高效构建并优化贴合自身业务场景的高精度OCR模型,实现从数据到部署的全流程掌握。

weixin_29263201的博客 570
上一篇: tomcat优化
下一篇: 序列初始化,指定值开始
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值