zip文件加密、解密解压实操,附带文件上传安全检查
Zip4J 使用
今天接触到一个要解压上传的加密zip的需求,这里使用 zip4j 来实现加密解密。
依赖
<dependency><groupId>net.lingala.zip4j</groupId><artifactId>zip4j</artifactId><version>2.9.0</version>
</dependency>
加密
/*** 添加普通文件为zip文件** @param srcPath 普通文件路径 E:\\test_zip_file\\image.png* @param destPath 要生成的zip文件路径 E:\\test_zip_file\\image.zip* @param password 加密密钥,为空时不加密 123456* @throws ZipException zip异常*/
public static void zip(String srcPath, String destPath, String password) throws ZipException {File srcFile = new File(srcPath);//创建目标文件ZipFile zipfile = new ZipFile(destPath);ZipParameters param = new ZipParameters();if (StringUtils.isNotBlank(password)) {zipfile.setPassword(password.toCharArray());param.setEncryptFiles(true);param.setEncryptionMethod(EncryptionMethod.ZIP_STANDARD);}zipfile.addFile(srcFile, param);
}
zipfile.setPassword(char[])
:设置压缩文件的密码;
param.setEncryptFiles(true);
param.setEncryptionMethod(EncryptionMethod.ZIP_STANDARD);
设置加密和加密的算法,还可以选择 EncryptionMethod
中的其他枚举
参考:https://github.com/srikanth-lingala/zip4j
解压(解密)
/*** 解压加密zip文件** @param files 客户端上送的加密zip文件* @return 解压后的真实文件*/
public static File[] unzip(MultipartFile[] files) {List<File> list = new ArrayList<>();Arrays.stream(files).forEach(file -> {String filename = file.getOriginalFilename();if (Objects.isNull(filename)) {LogUtils.error(log, "文件名为空:filename:{}", filename);CommonException.throwExp(ResultCode.INVALID_FILE_SUFFIX);}// 加密密钥 【这里以文件名作为密钥,实际可使用更安全的密钥】String key = FileNameUtil.mainName(filename);String tempPath = workDir + "temp" + File.separator + filename + "-" + UUID.fastUUID() + File.separator;LogUtils.info(log, "zip加密密钥:{},临时文件目录:{}", key, tempPath);ZipFile encryptFile = new ZipFile(AppFileUtils.multipartFileToFile(file));encryptFile.setPassword(key.toCharArray());try {encryptFile.extractAll(tempPath);} catch (ZipException e) {LogUtils.error(log, "解压加密zip文件到临时目录异常: {}", e);CommonException.throwExp(ResultCode.AUDIT_RESOURCE_READ_ERROR);}// 获取解压出来的文件【这里只是读取临时目录的单个文件】File tempDirFile = getTempDirFile(tempPath);// 存储解压出来的临时文件,然后删除list.add(tempDirFile);// 这里使用的 hutool 的 api FileUtil.deldeleteTempFiles(tempPath);});return list.toArray(new MultipartFile[0]);
}
zipfile.setPassword(char[])
:设置压缩文件的密码;
ZipFile.extract();
:解压文件到指定路径
zip 文件安全检查
/*** 上传文件安全检查* 1. 路径中不可包含../* 2. 文件名必须是.zip格式* 3. zip 必须加密** @param files 要上传的文件*/
public static void checkSecurity(MultipartFile[] files) {if (AppListUtils.isEmpty(Arrays.asList(files))) {LogUtils.warn(log, "上传文件为空");return;}Arrays.stream(files).forEach(file -> {String fileName = file.getOriginalFilename();// 路径中不可包含../if (Objects.isNull(fileName) || fileName.contains("../")) {LogUtils.error(log, "文件名称不合法");CommonException.throwExp(ResultCode.INVALID_FILE_SUFFIX);}String fileType = "";try {// hutoolfileType = FileTypeUtil.getType(file.getInputStream());} catch (Exception e) {LogUtils.error(log, "获取文件输入流异常:{}", e);}// 文件名必须是.zip格式, 文件必须以zip后缀if (!FileUtil.isExtendCompliance(fileName, "zip") || !"zip".equals(fileType)) {LogUtils.error(log, "文件后缀不合法");CommonException.throwExp(ResultCode.INVALID_FILE_SUFFIX);}// 必须是加密文件ZipFile zipFile = new ZipFile(AppFileUtils.multipartFileToFile(file));try {if (!zipFile.isEncrypted()) {LogUtils.error(log, "上传文件非加密文件");CommonException.throwExp(ResultCode.INVALID_FILE_SUFFIX);}} catch (ZipException e) {LogUtils.error(log, "上传文件判断加密异常: {}", e);CommonException.throwExp(ResultCode.AUDIT_RESOURCE_READ_ERROR);}});
}
zip文件加密、解密解压实操,附带文件上传安全检查相关推荐
- c语言文件加密解密单词统计,C语言文件加密解密及单词统计程序.doc
C语言文件加密解密及单词统计程序.doc (10页) 本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦! 15.9 积分 高级语言程序设计 课程设计学 院 计算 ...
- 【C 语言】文件操作 ( 文件加密解密 | 解密文件 )
文章目录 一.文件加密解密操作 1.解密整 4096 字节的数据 2.解密小于 4096 字节的数据 二.完整代码示例 1.文件加密操作 main.c 2.DES 加密解密头文件 des.h 3.第三 ...
- 【C 语言】文件操作 ( 文件加密解密 | 加密文件 )
文章目录 一.文件加密解密操作 1.加密整 4096 字节的数据 2.加密小于 4096 字节的数据 二.完整代码示例 1.文件加密操作 2.DES 加密解密头文件 3.第三方 DES 加密解密函数库 ...
- Linux下实现文件加密解密
Linux下利用异或加密解密算法实现文件加密解密 1.新建三个文件file1.file2.file2,分别用于存放原始数据.加密数据.解密数据.打开文件1写入原始数据.如图所示: 2.利用vi文本编辑 ...
- android下zip压缩文件加密解密的完美解决方案,Android之zip文件加密解压及进度条的实现...
zip文件的解压可以使用java的zip库,但是没有实现对加密文件的解压功能,这里可以使用zip4j来实现.具体可以参看该文<Android下zip压缩文件加密解密的完美解决方案 http:// ...
- c语言编程文件的加密解密,C语言实现任何文件的加密解密功能
本文实例为大家分享了C语言实现文件加密解密功能的具体代码,供大家参考,具体内容如下 使用命令提示符,实现任何文件的加密和解密功能. 代码如下: //#define _CRT_SECURE_NO_WAR ...
- java 文件进行加密解密,java 对文件加密解密,该如何解决
java 对文件加密解密 本帖最后由 Hong_1993 于 2014-09-03 10:51:35 编辑 我现在想做一个基于spring mvc 模式的 实现对 文件或目录文件 的加解密(de ...
- 简单文件加密解密系统(c++)
简单文件加密解密系统(c++) 一.原理 二.实现思路 三.c++代码 四.运行结果 一.原理 为了实现加解密,首先需要一个码本文件.一个基本的码本文件包含26个字母,即a~z打乱顺序的结果,比如 ...
- 批量解压多个zip压缩包并将解压出来的文件以该压缩包的名称重命名
批量解压多个zip压缩包并将解压出来的文件以该压缩包的名称重命名.bat 复制下面的内容保存成bat文件即可运行: @echo off rem 批量解压多个zip压缩包并将解压出来的文件以该压缩包的名 ...
最新文章
- Java 并发专题 :FutureTask 实现预加载数据 在线看电子书、浏览器浏览网页等
- POJ2931不平等博弈
- 微软软件推送服务器,微软将通过系统更新功能向大部分用户推送新版Microsoft Edge浏览器-...
- Openstack命令
- groupby java_Java8的groupBy实现集合的分组
- 学完这篇Charles抓包教程,我直接把fiddler卸载了
- git常用命令(史上最经典)
- java.lang.ClassNotFoundException: org.springframework.web.util.WebAppRootListener
- mac install: /usr/bin/unrar: Operation not permitted
- 理解MeasureSpec
- 大数据时代的大数据技术与应用有哪些
- 泛微OA主表与明细表的js操作
- Docker实用指令整理
- docker启动elasticsearch容器put数据时: SERVICE_UNAVAILABLE/1/state not recovered /initialized
- 01336软件项目管理复习
- iOS app 打包发布
- 全国计算机二级---公共基础部分知识点(自用总结)
- 服务器信号有杂音怎么回事,电脑麦克风有杂音滋滋怎么解决
- C#修改AD账号及密码
- 大数据背后的神秘公式:贝叶斯公式(万字长文)
热门文章
- php Wrapper LFI,PHP安全之LFI漏洞GetShell方法大阅兵
- 孕妇有什么副业做?孕妇在家有哪些兼职可以做?
- 支架预压弹性变形值计算_支架预压方案介绍 支架预压时间要多久
- linux运行windows程序6,linux 下通过wine 运行windows程序包括IE
- 启明星辰EDR长时间不访问导致拒绝连接的问题
- 计算机2级考试题目4
- 解析BeanFactory的核心方法——getBean
- MySQL快速导入数据
- 加快云原生技术转型, 智能调度登陆华为云DevOps: 增速,节源
- JavaScript的undefine和null