ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

Apache Fesod 工作簿密码保护实战:读写加密 Excel 的完整指南

Apache Fesod 工作簿密码保护实战:读写加密 Excel 的完整指南 后端【免费下载链接】fesodFast. Easy. Done. Processing spreadsheets without worrying about large files causing OOM.项目地址https://gitcode.com/gh_mirrors/fast/fesod点击查看免费下载本文基于 Apache FesodIncubating的官方文档 website/docs/sheet/advanced/password.md讲解如何通过FesodSheet的 builder 链为.xlsx/.xls文件配置读写密码并结合仓库源码剖析.xlsxAES 加密与.xlsBIFF8 写保护/加密两条底层实现路径的差异。读完本文你将能写出一行配置即可加密的读写代码理解加密过程中内存占用偏高的原因并掌握密码错误的异常处理与生产环境安全实践。概述Fesod 对 Excel 密码保护的支持方式Fesod 完整支持 Excel 内置的密码保护能力读写两个方向都覆盖写入方向通过FesodSheet.write(...)返回的ExcelWriterBuilder调用.password(xxx)写出加密文件读取方向通过FesodSheet.read(...)返回的ExcelReaderBuilder调用.password(xxx)解密并读取加密文件。API 层面两者对称且极简但底层实现针对不同文件格式有本质区别这是使用前必须建立的认知对.xlsxOOXML输出Fesod 基于 Apache POI 的标准加密方案EncryptionMode.standardAES 系列算法对整份文件做内容级加密。由于该过程会把整个工作簿读入内存再重写大工作簿加密时内存占用会显著升高详见 ExcelWriterBuilder.java 中password(...)的 Javadoc 警告Encryption is when the entire file is read into memory, so it is very memory intensive。对传统.xlsBIFF8文件密码保护走的是 POI 的Biff8EncryptionKey机制其行为更接近写保护/BIFF8 记录级加密与.xlsx的整文件内容加密在行为与安全保证上并不等价。仓库中的 EncryptDataTest.java 专门验证了即使.xls写入密码后未提供正确密码时读取会抛EncryptedDocumentException说明其内容同样受到 BIFF8 记录级加密保护而非仅打上只读标记。写入带密码的工作簿完整代码示例Test public void passwordWrite() { String fileName passwordWrite System.currentTimeMillis() .xlsx; FesodSheet.write(fileName) .password(your_password) .head(DemoData.class) .sheet(PasswordSheet) .doWrite(data()); }要点说明.password(your_password)在ExcelWriterBuilder上设置WriteWorkbook的密码字段见 ExcelWriterBuilder.java它调用writeWorkbook.setPassword(password)后返回当前 builder因此可以继续链式调用.head(...)、.sheet(...).head(DemoData.class)声明表头模型.sheet(PasswordSheet)指定工作表名称.doWrite(data())执行写出文件扩展名.xlsx决定走 AES 加密路径若把文件名改为.xls则走 BIFF8 路径见下文格式差异。源码层面的加密时机与实现写出流程最终由 WriteContextImpl.java 统一收口加密发生在工作簿内容写完之后的收尾阶段分两种通道1. XLSX 文件通道doFileEncrypt07第 699-714 行该方法先做两个前置判断密码为空或文件类型不是XLSX时直接返回文件对象为空也直接返回。随后调用openFileSystemAndEncrypt(...)第 727-736 行完成加密POIFSFileSystem fileSystem new POIFSFileSystem(); Encryptor encryptor new EncryptionInfo(EncryptionMode.standard).getEncryptor(); encryptor.confirmPassword(writeWorkbookHolder.getPassword()); try (OPCPackage opcPackage OPCPackage.open(file, PackageAccess.READ_WRITE); OutputStream outputStream encryptor.getDataStream(fileSystem)) { opcPackage.save(outputStream); } return fileSystem;这段代码揭示了.xlsx加密的核心原理先以EncryptionMode.standardAES创建Encryptor并确认密码再以读写模式打开已写好的 OOXML 包把包内容整体写入加密数据流。注意OPCPackage.open(...)与opcPackage.save(...)意味着整个工作簿内容都要驻留内存——这就是官方 Javadoc 明确警告加密非常吃内存的根源。2. XLSX 输出流通道doOutputStreamEncrypt07第 663-694 行当目标是OutputStream而非文件时加密同样先落地一个临时.xlsx文件FileUtils.createTmpFile(...)再复用同一个openFileSystemAndEncrypt流程加密最后fileSystem.writeFilesystem(outputStream)写入目标流。因此无论文件通道还是流通道xlsx加密的内存成本是一致的。3. XLS 通道clearEncrypt03第 649-655 行对.xls类型Fesod 走 POI 的Biff8EncryptionKey线程本地密钥机制写出后会把Biff8EncryptionKey.setCurrentUserPassword(null)清空防止密钥残留污染后续写出。配套的 WorkBookUtilTest.java 验证了createWorkBook()之后 BIFF8 加密密码必须继续保持设置直到文件最终写出完毕这确保了HSSFWorkbook.write()阶段能拿到正确的密钥。读取带密码的工作簿完整代码示例Test public void passwordRead() { String fileName path/to/encrypted.xlsx; FesodSheet.read(fileName, DemoData.class, new DemoDataListener()) .password(your_password) .sheet() .doRead(); }要点说明.password(your_password)在ExcelReaderBuilder上设置ReadWorkbook的密码字段见 ExcelReaderBuilder.java它调用readWorkbook.setPassword(password)DemoData.class是行数据模型DemoDataListener实现ReadListener逐行回调处理数据.sheet()进入 sheet 配置阶段.doRead()触发流式SAX解析。读取端的格式嗅探与解密分流读取加密文件时Fesod 的入口分析器 ExcelAnalyserImpl.java 在chooseExcelExecutor中会先做一次嗅探先用POIFSFileSystem打开文件判断其根目录是否含有Decryptor.DEFAULT_POIFS_ENTRY这是加密 OOXML 包的标准入口标记若命中说明外表像.xls、内里其实是加密的.xlsx此时调用DocumentFactoryHelper.getDecryptedStream(poifsFileSystem.getRoot().getFileSystem(), readWorkbook.getPassword())解密出明文流并改走XlsxSaxAnalyser按 XLSX 处理第 137-153 行若未命中才真正按.xls处理交给XlsSaxAnalyser。XlsxSaxAnalyser的构造函数XlsxSaxAnalyser.java接收这个decryptedStream通过readOpcPackage打开OPCPackage后继续常规的 SAX 流式解析。而.xls的读取则由 XlsSaxAnalyser.java 处理setCurrentUserPassword()从readWorkbookHolder取出密码并调用Biff8EncryptionKey.setCurrentUserPassword(password)注入 POI 的 HSSF 解密栈解析结束后在finally中通过clearCurrentUserPassword()将密钥清空避免线程残留。值得注意的是加密 XLSX 走XlsxSaxAnalyser时不会注入Biff8EncryptionKey两者机制互相独立。密码错误的典型表现根据官方文档与 EncryptDataTest.java 的断言不提供或提供错误密码时读取会抛出org.apache.poi.EncryptedDocumentExceptionAssertions.assertThrows(EncryptedDocumentException.class, () - FesodSheet.read(file, SimpleData.class, listener) .excelType(ExcelTypeEnum.XLS) .sheet() .doReadSync());该测试同时证明了.xls场景下无密码必失败、正确密码必成功的完整闭环第 116-140 行是验证加密行为最直接的仓库证据。加密读写的全组合回归测试仓库在 EncryptDataTest.java 中用参数化测试覆盖了加密读写的全部组合维度取值输入形式文件File/ 输出流Stream是否显式指定类型不指定 / 显式指定excelType是否带密码无密码 / 带密码PASSWORD 123456测试逻辑readAndWrite体现了两个实战要点流式 API 必须显式声明类型当基于InputStream/OutputStream读写且未显式指定excelType时需要调用.excelType(ExcelTypeEnum.XLSX)等手动指定否则无法从流中可靠嗅探格式源码注释 Stream API needs type hint when not explicitly set读写密码必须一致excelWriterBuilder.password(PASSWORD)与readerBuilder.password(PASSWORD)配对使用写 10 行数据后doReadSync()必须完整读回 10 行且字段非空。安全注意事项与生产实践官方文档对密码保护的安全语义与工程实践给出三条明确建议加密的是文件内容本身Excel 密码保护会加密文件内容没有密码的人无法读取文件内部数据而不是简单的禁止修改标记密码错误必然抛异常缺少正确密码时读取会抛出EncryptedDocumentException因此业务代码应在调用.doRead()的地方捕获该异常给出密码错误或文件已加密的友好提示避免堆栈直接暴露给终端用户禁止硬编码密码生产环境中不要把密码写死在代码或配置仓库里应使用配置文件如环境变量、application.yml外部化配置、密钥管理服务KMS / Vault等机制动态注入同时结合仓库 EncryptDataTest.java 的做法用固定测试密码仅用于自动化验证。此外结合源码还可以补充两条官方文档未展开、但直接影响落地选型的结论.xlsx加密的内存代价是刚性的因为OPCPackage.open(...)save(...)需要整包驻留内存加密大文件前应评估 JVM 堆-Xmx必要时搭配 large-file.md 中介绍的流式读写策略把加密 超大文件这类组合场景单独压测.xls与.xlsx的安全语义不同.xlsx是标准的 AES 内容加密.xls是 BIFF8 记录级加密POIBiff8EncryptionKey机制。虽然 EncryptDataTest.java 证明.xls也是真加密而非仅写保护但两者加密强度与行为仍有差异对安全敏感场景应优先使用.xlsx。结语Apache Fesod 的密码保护 API 只有一行.password(xxx)但底层为.xlsxEncryptionMode.standardAES 加密、整包内存重写与.xlsBIFF8 密钥注入设计了完全不同的两条加密链路并在读取端通过Decryptor.DEFAULT_POIFS_ENTRY嗅探实现加密 XLSX 伪装 XLS的透明解密。本文的代码示例可直接复制运行源码路径ExcelWriterBuilder.java、ExcelReaderBuilder.java、WriteContextImpl.java、ExcelAnalyserImpl.java、EncryptDataTest.java可供继续深入阅读。赞分享后端【免费下载链接】fesodFast. Easy. Done. Processing spreadsheets without worrying about large files causing OOM.项目地址https://gitcode.com/gh_mirrors/fast/fesod点击查看免费下载相关推荐如何用Apache Fesod实现Excel加密保护敏感数据的终极指南如何用Apache Fesod实现Excel加密保护敏感数据的终极指南 Apache Fesod作为easyexcel作者的最新升级版本是一款快速、简洁且能后端NPOI加密文档处理如何读写受密码保护的Office文件NPOI加密文档处理如何读写受密码保护的Office文件 NPOI是一个强大的.NET开源库能够在不安装Microsoft Office的情况下读写Offi后端Apache Fesod入门指南10分钟学会高性能Excel读写操作Apache Fesod入门指南10分钟学会高性能Excel读写操作 Apache Fesod是easyexcel作者最新升级版本一款快速、简洁、解决大文件后端上一篇Tornado文件上传终极指南支持大文件分块上传的完整教程下一篇SlimToolkit完全指南如何将容器镜像缩小30倍并增强安全性创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表