java实现文件加解密方案

0、前序

上传加密:客户端上传文件,后台加密,将加密后的文件存储到文件服务器

下载解密:客户端请求文件,后台从文件服务器获取密文,解密返回客户端

注:对文件服务器上存储的文件需要做防篡改校验

效果预览:原文件,密文件,解密文件

java实现文件加解密方案

1、客户端(html)

2、客户端上传、请求文件

java实现文件加解密方案

3、服务端(源码)

package com.huang.mydemo.encryption;

import org.apache.commons.codec.digest.DigestUtils;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.*;

@RestController
@RequestMapping(value = "api/v1/test")
public class FileUploadEncryptionController {
    //加密解密秘钥,不能超过一个字节,也就是8位(生产环境可针对每个文件随机生成秘钥,确保每个文件的秘钥都不一样)
    private static final int secretKey = 99;     //0x99 十六进制0-99,10进制0-255随机产生【异或】秘钥
    private static int dataByte = 0; //文件字节内容

    /**
     * 文件加密
     * @param file   上传的文件
     * @param request
     * @return
     */
    @PostMapping("file/encryption")
    public String encryption(@RequestParam("file") MultipartFile file, HttpServletRequest request) {
        try {
            //0、先检查文件是否被篡改:此操作
            String srcMd5 = DigestUtils.md5Hex(file.getInputStream());
            System.out.println("源文件MD5:"+srcMd5);

            String clintMD5 = request.getParameter("clintMD5");
            System.out.println("clintMD5:"+clintMD5);

            if(!clintMD5.equals(srcMd5))  return "上传文件被篡改";

            //2、创建加密文件:临时文件
            File encFile = new File("F:\\Users\\admin\\Desktop\\enc_file.png");
            if(!encFile.exists()){
                encFile.createNewFile();//创建临时文件
            }

            //3、加密文件
            InputStream fis = file.getInputStream();
            OutputStream fos = new FileOutputStream(encFile);

            System.out.println("-------加密开始------");
            while ((dataByte = fis.read()) > -1) {
                fos.write(dataByte^secretKey);
            }

            fis.close();
            fos.flush();
            fos.close();
            System.out.println("-------加密完成------");

            //4、生成加密文件的MD5,防止文件服务器篡改
            String encMd5 = DigestUtils.md5Hex(new FileInputStream(encFile));
            System.out.println("密文件MD5:"+encMd5);

            //TODO 5、存储加密文件

            //TODO 6、删除临时文件:encFile

            return "ok";
        } catch (Exception e) {
            return e.getMessage();
        }
    }

    /**
     * 解密文件
     * @param response
     */
    @GetMapping("file/decryption")
    public void decryption(HttpServletResponse response) {
        File f = null;
        try {
            //TODO 1、从文件服务器获取加密文件(这里直接取上面加密后的临时文件,生产环境从oss或其他文件服务器获取)
            File encFile = new File("F:\\Users\\admin\\Desktop\\enc_file.png");
            //加密文件的MD5值,检查文件是否被篡改
            String encMd5 = DigestUtils.md5Hex(new FileInputStream(encFile));
            System.out.println("密文件MD5:"+encMd5);

            //TODO 2、encMd5与存储时的密码MD5进行比对(略),检查文件是否被篡改

            //3、创建解密文件:临时文件
            File decFile = new File("F:\\Users\\admin\\Desktop\\dec_file.jpeg");

            if(!decFile.exists()){
                decFile.createNewFile();//创建临时文件
            }

            //4、解密
            InputStream fis  = new FileInputStream(encFile);
            OutputStream fos = new FileOutputStream(decFile);

            System.out.println("--------------解密开始--------------");
            while ((dataByte = fis.read()) > -1) {
                fos.write(dataByte^secretKey);
            }
            fis.close();
            fos.close();
            fos.flush();

            System.out.println("--------------解密完成--------------");

            //TODO 5、响应数据添加MD5,防止响应文件数据被篡改

            //6、返回解密后的文件
            InputStream stream = new FileInputStream(decFile);
            ServletOutputStream out = response.getOutputStream();

            byte buff[] = new byte[1024];
            int length = 0;

            while ((length = stream.read(buff)) > 0) {
                out.write(buff,0,length);
            }
            stream.close();
            out.close();
            out.flush();

            //TODO 7、删除临时文件:decFile

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

4、思路(复盘)

java实现文件加解密方案

Original: https://www.cnblogs.com/unruly/p/15992273.html
Author: 福尔摩狼
Title: java实现文件加解密方案

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/579632/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • C#中服务端接受前端JSON字符串转换成字典集合

    我们是否可以把从前端接受的JSON字符串转换成字典集合呢? 比如从前端接收:{‘size’:’10’, ‘weight&…

    Java 2023年5月30日
    074
  • 面试题:sleep() 和 wait()的区别?

    1.相同点: 一旦执行方法,都可以使得当前的线程进入阻塞状态。 2.不同点: 1)两个方法声明的位置不同:Thread类中声明sleep() , Object类中声明wait()2…

    Java 2023年6月14日
    072
  • rocketmq有序消息

    RocketMQ提供的顺序消费消息实现是使用的FIFO 先进先出算法 Producer消息发送 public class Producer { public static void…

    Java 2023年6月16日
    067
  • 函数式编程/lambda表达式入门

    函数式编程/lambda表达式入门 本篇主要讲解 lambda表达式的入门,涉及为什么使用函数式编程,以及jdk8提供的函数式接口 和 接口的默认方法 等等 1.什么是命令式编程 …

    Java 2023年6月9日
    091
  • elasticsearch集群搭建

    1.部署es集群 我们会在单机上利用docker容器运行多个es实例来模拟es集群。不过生产环境推荐大家每一台服务节点仅部署一个es的实例。 部署es集群可以直接使用docker-…

    Java 2023年6月9日
    074
  • LEDE 虚拟机安装

    虽然我对路由器没什么兴趣,但是紧跟潮流还是有必要的,现在因为网络闭关锁国政策,很多人都想自己搭配一台私人的服务器,不想被商业公司左右数据安全。我感觉这个是一个商机,建议大家可以朝这…

    Java 2023年5月30日
    085
  • Java 泛型擦除

    泛型擦除概念 Java的泛型是伪泛型,这是因为Java在 编译期间,所有的泛型信息都会被擦掉,正确理解泛型概念的首要前提是理解类型擦除。Java的泛型基本上都是在编译器这个层次上实…

    Java 2023年5月29日
    090
  • 【hexo博客搭建】本地搭建hexo博客(上)

    前言 本篇文章会从本地(Windows 10)搭建-主题更换-部署阿里云详细步骤,如果在搭建过程中,遇到问题,可以通过博客页脚下的QQ联系我,或者在下面评论留言 一.本地搭建 1….

    Java 2023年6月13日
    069
  • DOM

    DOM 所谓DOM是给文档中的每一个标签都对应的创建一个对象。 在JS中默认就会为页面的所有的标签创建一个对应的对象模型。我们可以通过对应的API获取这些对象模型,通过这些对象模型…

    Java 2023年6月7日
    089
  • FastAPI启用HTTPS

    前提: 你需要购买一个域名, 假如是国内的法服务器的话, 需要备案, 否则无法解析当你买了域名后, 一般可以免费生成证书 下载证书 由于我是在腾讯云购买的域名, 所以在腾讯云中下载…

    Java 2023年6月7日
    082
  • redis 架构 数据类型

    架构 string 如果一个字符串对象保存的是整数值,此时使用的int编码 如果一个字符串对象保存的字符串长度大于32字节,使用的raw(sds)编码 如果一个字符串对象保存的字符…

    Java 2023年6月5日
    086
  • Activiti7 多实例子流程

    顾名思义,子流程是一个包含其他活动、网关、事件等的活动,这些活动本身形成了一个流程,该流程是更大流程的一部分。 使用子流程确实有一些限制: 一个子流程只能有一个none类型的启动事…

    Java 2023年6月7日
    0101
  • Java笔记_web.xml文件

    在JavaEE工程中,web.xml文件是用来初始化配置信息:比如Welcome页面、servlet、servlet-mapping、filter、listener、启动加载级别等…

    Java 2023年6月5日
    092
  • 十二、线程介绍

    进程是资源管理的最小单位,那么每个进程 都拥有自己的数据段、代码段和堆栈段。 这必然就造成了进程在进行切换时都需要有比较复杂的上下文切换等动作,因为要保存当前进程上下文的内容, 还…

    Java 2023年5月30日
    096
  • Mybatis源码解读-插件

    注册 xml方式的注册,是在XMLConfigBuilder#pluginElement完成的。 不明觉厉的同学,请参考上一篇文章:Mybatis源码解读-配置加载和Mapper的…

    Java 2023年6月16日
    0113
  • 数据库系统概论小结(四)【面向考试】

    数据库系统概论小结(四)【面向考试】 第五章 数据库完整性 数据库的完整性指数据的正确性和相容性。 正确性:符合现实世界的描述。 相容性:同一对象在不同表里面是符合逻辑的。 维护完…

    Java 2023年6月16日
    082
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球