请问有什么开源的项目支持导出加密的 xls 文件吗?或者微软官方加解密文档提供? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
zurmokeeper
V2EX    程序员

请问有什么开源的项目支持导出加密的 xls 文件吗?或者微软官方加解密文档提供?

  •  
  •   zurmokeeper
    zurmokeeper 2024-07-25 09:18:37 +08:00 5983 次点击
    这是一个创建于 496 天前的主题,其中的信息可能已经有所发展或是发生改变。

    请问有什么开源的项目支持导出加密的 xls 文件吗?

    试过 java 的 poi, easyexcel, c# 的 npoi, EPPlus, ExcelDataReader ,python 的 msoffcrypto-tool

    c++ 的 openoffice, libreoffice ,go 的 excelize 都没有发现没有这个功能。

    现在想写 xls 文件的加密,但是一直没有成功,所以想找一些资源来参照,官方文档 完全没有说加密,只说了解密。

    第 1 条附言    2024-07-25 10:59:57 +08:00
    其实我是想用 node.js 写这个给 office 文件( xls, doc, ppt )加密的方法,我已经都实现了解密的方法,下面这个是我的 JS 库

    https://www.npmjs.com/package/officecrypto-tool

    本来我以为加密方法是解密的逆推过程,但是我按照逆推写的加密方法导出的文件 WPS 打开的时候报错了,查看文件发现有少量字节数据的差别,微软官方又没给具体的加密过程,只好自己去摸索,所以想找其他语言的实现来参考,但是一直没找到。
    58 条回复    2024-07-25 21:29:11 +08:00
    asdjgfr
        1
    asdjgfr  
       2024-07-25 09:28:43 +08:00
    SWALLOWW
        2
    SWALLOWW  
       2024-07-25 09:34:01 +08:00   3
    换个思路,导出个加密的压缩包?
    yesterdaysun
        3
    yesterdaysun  
       2024-07-25 09:36:16 +08:00
    zurmokeeper
        4
    zurmokeeper  
    OP
       2024-07-25 09:50:06 +08:00
    @asdjgfr 没有的,这个加解密都不支持的
    zurmokeeper
        5
    zurmokeeper  
    OP
       2024-07-25 09:50:37 +08:00
    @yesterdaysun 都看过了,不支持 xls 格式的加密
    zurmokeeper
        6
    zurmokeeper  
    OP
       2024-07-25 09:52:39 +08:00
    @SWALLOWW 还是想实现 xls 自己的加密,就像 WPS 保存 xls 格式的设密码一样,其实我已经实现了一部分,但是加密以后的文件和 WPS 加密出来还有少量字节数据的差异,不知道哪里不对,所以想找其他资料对比一下
    yesterdaysun
        7
    yesterdaysun  
       2024-07-25 10:02:28 +08:00
    wxyrrcj
        8
    wxyrrcj  
       2024-07-25 10:36:30 +08:00
    wxyrrcj
        9
    wxyrrcj  
       2024-07-25 10:39:23 +08:00
    // 把工作薄输出到字节里面
    bout = new ByteArrayOutputStream();
    workbook.write(bout);
    bout.flush();
    workbookinput = new ByteArrayInputStream(bout.toByteArray());
    // 读取临时文件进行加密
    POIFSFileSystem fs = new POIFSFileSystem();
    EncryptionInfo info = new EncryptionInfo(fs, EncryptionMode.agile);
    Encryptor enc = info.getEncryptor();
    enc.confirmPassword("123456");//打开 excel 密码
    // 然后把字节输入到输入流,然后输入到 OPC 包里面
    opc = OPCPackage.open(workbookinput);
    os = enc.getDataStream(fs);
    opc.save(os);
    opc.close();
    // 返回给浏览器
    outstream = response.getOutputStream();
    response.reset();
    response.setHeader("Content-disposition",
    "attachment; filename=" + new String(title.getBytes(), "UTF-8") + ".xlsx");
    response.setContentType("application/x-download");
    fs.writeFilesystem(outstream);
    wxyrrcj
        10
    wxyrrcj  
       2024-07-25 10:40:00 +08:00
    再转下 xls 不知道行不行
    zurmokeeper
        11
    zurmokeeper  
    OP
       2024-07-25 10:53:17 +08:00
    @wxyrrcj 不行,xls 不是用 EncryptionMode.agile 加密的,这个是 xlsx 格式用的,xls 有自己的加密算法
    zurmokeeper
        12
    zurmokeeper  
    OP
       2024-07-25 10:54:08 +08:00
    @yesterdaysun 商业的我看不到源码,说是有个 openxls 的开源版,却一直没找到源码
    ShirOvO
        13
    ShirOvO  
       2024-07-25 11:42:09 +08:00
    easyexcel 里面我是使用的
    public void afterSheetCreate(
    WriteWorkbookHolder writeWorkbookHolder, WriteSheetHolder writeSheetHolder) {
    // 设置保护密码
    writeSheetHolder.getSheet().protectSheet("123456");
    }来设置密码,刚才试了一下 xls 格式,也是可用的
    zurmokeeper
        14
    zurmokeeper  
    OP
       2024-07-25 12:08:38 +08:00
    @ShirOvO 你这个只是单元格的保护,不是整个文件的保护,发不了图片有点尴尬
    ShirOvO
        15
    ShirOvO  
       2024-07-25 13:38:37 +08:00
    @zurmokeeper #14 你是需要密码才能打开 excel 吗?
    victorting
        16
    victorting  
       2024-07-25 13:39:31 +08:00
    zurmokeeper
        17
    zurmokeeper  
    OP
       2024-07-25 13:40:52 +08:00
    @ShirOvO 我是需要把一个 xls 用密码加密以后导出,WPS 和 office 都是支持的,然后打开的时候输入密码才能打开
    zurmokeeper
        18
    zurmokeeper  
    OP
       2024-07-25 13:41:47 +08:00
    @victorting 这个只支持 xlsx 格式,不支持 xls 的
    ShirOvO
        19
    ShirOvO  
       2024-07-25 13:45:22 +08:00
    @zurmokeeper #17 这样的 xiao'guo'ma 效果吗?导出的 xls 格式的
    cheng6563
        20
    cheng6563  
       2024-07-25 13:46:11 +08:00
    xls 就是这样的,无标准,那几个字节自己猜吧。
    zurmokeeper
        21
    zurmokeeper  
    OP
       2024-07-25 13:49:51 +08:00
    @ShirOvO 是的,在 MS office 上是这样的
    zurmokeeper
        22
    zurmokeeper  
    OP
       2024-07-25 13:51:54 +08:00
    @cheng6563 不是吧,那岂不是所有做这方面应用的,比如收费的 WPS ,sheetjs 收费版还有一些收费的软件,都得去猜,这样怎么互相做兼容?
    ShirOvO
        23
    ShirOvO  
       2024-07-25 13:56:56 +08:00
    @zurmokeeper #21 我刚才在 wps 也测试了一下,也是一样的效果,是使用的 easyexcel 实现的,参考代码 EasyExcelFactory.write(response.getOutputStream(), objectClass)
    .registerWriteHandler(new CustomSheetWriteHandler()).registerWriteHandler(new StyleWriteHandler())
    .registerWriteHandler(new LongestMatchColumnWidthStyleStrategy())
    .autoCloseStream(Boolean.FALSE).password("123").sheet(sheetName).doWrite(list);,password('密码')方法就是设置密码
    caomu
        24
    caomu  
       2024-07-25 13:57:47 +08:00 via Android
    对啊,wps 对 ms 就是会在一些小细节上有一些奇奇怪怪的兼容问题,只是 wps 有能力研发去解决而已,他们自己也以此标榜……再看很久以前的 openoffice 项目的兼容性那就是一团糟
    markss
        25
    markss  
       2024-07-25 14:04:02 +08:00
    xls2xlsx 在对 xlsx 进行加密是否可以满足要求?
    zurmokeeper
        26
    zurmokeeper  
    OP
       2024-07-25 14:08:03 +08:00
    @ShirOvO 不知道 v 站这里能发文件,大佬可以 https://github.com/zurmokeeper/officecrypto-tool/issues/17 在这个 issue 这里,把你用 easyexcel 加密生成以后的 excel 上传一下吗?
    zurmokeeper
        27
    zurmokeeper  
    OP
       2024-07-25 14:10:28 +08:00
    @markss 不行,我只是想实现 xls 格式的加密,xlsx 格式的加密已经实现了。不过请问下你说的 xls2xlsx 有具体的实现吗?是说找个工具把 xls 先转成 xlsx ,然后再对 xlsx 去加密?
    ShirOvO
        28
    ShirOvO  
       2024-07-25 14:11:38 +08:00
    @zurmokeeper #26 已上传,你可以看看是否符合要求
    zurmokeeper
        29
    zurmokeeper  
    OP
       2024-07-25 14:12:52 +08:00
    @caomu 哭死,这就是那么多不同语言的 excel 开源项目,没有一个实现 xls 加密的原因吗?
    zurmokeeper
        30
    zurmokeeper  
    OP
       2024-07-25 14:14:05 +08:00
    @ShirOvO 感谢,我去看看
    markss
        31
    markss  
       2024-07-25 14:27:52 +08:00
    试了下,libreoffice gui 保存 xls 文件时候可以选择输入密码,不过命令行 password 参数没有找到相关的文档。
    zurmokeeper
        32
    zurmokeeper  
    OP
       2024-07-25 14:43:01 +08:00
    @ShirOvO 破案了,虽然导出的文件格式虽然是 xls ,但是本质上是个 xlsx 文件,只是把后缀改成 xls 导出而已,我看加密的方案用的都是 xlsx ,我把你上传的文件解密以后就是一个 xlsx 格式的内容,之前我看下 easyexcel 的源码,他的加解密都是基于 poi 实现的,poi 不支持它也不支持
    ShirOvO
        33
    ShirOvO  
       2024-07-25 14:45:14 +08:00
    @zurmokeeper #32 我只是忘了更改 content-type 这个可以更改的
    zurmokeeper
        34
    zurmokeeper  
    OP
       2024-07-25 14:46:08 +08:00
    @markss 大佬可以在这里贴下截图吗? https://github.com/zurmokeeper/officecrypto-tool/issues/17 ,或者帮忙加密保存一个 xls 格式的文件,帮忙贴一下。我之前看了下 libreoffice 在 github 上的源码,我只隐约看到可能有 doc 格式的加密,但是没有发现 xls 加密的代码
    tf2
        35
    tf2  
       2024-07-25 14:47:05 +08:00
    @zurmokeeper xlsx 的加密好像就是直接 zip 加密。。。。
    zurmokeeper
        36
    zurmokeeper  
    OP
       2024-07-25 14:48:06 +08:00
    @ShirOvO 大佬,可以再帮忙设置一下,再导出一个 xls 格式的?上传到刚才那个地址吗?我这边 java 环境一直有问题。
    zurmokeeper
        37
    zurmokeeper  
    OP
       2024-07-25 14:49:35 +08:00
    @lambdaq xlsx 也不是,也有自己的加密算法,这个已经实现,大佬有兴趣可以看看 officecrypto-tool 的实现
    tf2
        38
    tf2  
       2024-07-25 14:52:36 +08:00
    @zurmokeeper 你实现了每个表单的加密吗?这个好像就麻烦一点。
    momo1999
        39
    momo1999  
       2024-07-25 14:56:11 +08:00
    猜不到就逆向……
    ShirOvO
        40
    ShirOvO  
       2024-07-25 15:00:40 +08:00
    @zurmokeeper #36 已上传
    markss
        41
    markss  
       2024-07-25 15:01:34 +08:00
    @zurmokeeper 粘贴了
    zurmokeeper
        42
    zurmokeeper  
    OP
       2024-07-25 15:02:49 +08:00
    @lambdaq 关于 xlsx 格式的加密,微软有给一些文档,同时社区很多语言都有实现,比如 py 的 msoffcrypto-tool 等,所以这个比较简单
    zurmokeeper
        43
    zurmokeeper  
    OP
       2024-07-25 15:04:07 +08:00
    @shuax 现在就是在逆向,但是就是还有一些字节数据,一直加密不对,导致最后始终加密不成功,不知道是哪几个字节出了问题
    zurmokeeper
        44
    zurmokeeper  
    OP
       2024-07-25 15:14:44 +08:00
    @markss 感谢,我看看
    zurmokeeper
        45
    zurmokeeper  
    OP
       2024-07-25 15:14:57 +08:00
    @ShirOvO 感谢,我看看
    markss
        46
    markss  
       2024-07-25 16:38:54 +08:00
    @zurmokeeper
    单看了下 libreoffice 应该在这个目录下面:
    sfx2/source/doc ole 三品类相关的应该都有
    ShirOvO
        47
    ShirOvO  
       2024-07-25 16:41:00 +08:00
    @zurmokeeper #45 有突破吗?
    zurmokeeper
        48
    zurmokeeper  
    OP
       2024-07-25 17:14:30 +08:00
    @ShirOvO 刚忙其他了,简单看了下的确是 xls 格式的加密,但是有点奇怪用 WPS 能打开,但是用我自己的 officecrypto-tool 却报密码错误,不知道是哪里有问题,还要再看看
    zurmokeeper
        49
    zurmokeeper  
    OP
       2024-07-25 17:17:07 +08:00
    @markss libre_123.xls 的确是加密成功了,也能正常解,不知道是不是我哪里看漏了,得好好看下源码
    zurmokeeper
        50
    zurmokeeper  
    OP
       2024-07-25 17:19:38 +08:00
    @ShirOvO 大佬可以把完整的导出加密的代码贴一下到 github issue 吗?我不是很懂 java ,后续得慢慢研究 debug
    ShirOvO
        51
    ShirOvO  
       2024-07-25 17:36:15 +08:00
    @zurmokeeper #50 已贴
    zurmokeeper
        52
    zurmokeeper  
    OP
       2024-07-25 18:30:07 +08:00
    @ShirOvO 感谢,现在我的 officecrypto-tool 也可以解密,刚我手动改了源码出问题了,有兴趣一起研究下吗?
    ShirOvO
        53
    ShirOvO  
       2024-07-25 18:44:48 +08:00
    @zurmokeeper #52 只是我没学过 nodejs ,不过对此也有兴趣,可以加个联系方式
    jenson47
        55
    jenson47  
       2024-07-25 19:57:47 +08:00
    除了 excel 之外,其实 word 也可以使用,正如 #35 楼所说的,我认为是 tar 包加密,实际上 word ,excel 之前就是个 tar 包
    加密实现可以参考这个
    https://github.com/nick322/secure-spreadsheet
    zurmokeeper
        56
    zurmokeeper  
    OP
       2024-07-25 21:20:11 +08:00
    @lysShub 这个只是 xlsx 格式的加密,不是 xls 的,算法实现不一样
    zurmokeeper
        57
    zurmokeeper  
    OP
       2024-07-25 21:22:31 +08:00
    @jenson47 xlsx, docx, pptx 本质上是个 zip ,就是新的 ooxml 格式,但是 xls ,doc, ppt 这些老的格式不一样,加解密的算法不一样,这个我看了是 xlsx 的
    zurmokeeper
        58
    zurmokeeper  
    OP
       2024-07-25 21:29:11 +08:00
    @ShirOvO https://github.com/zurmokeeper/officecrypto-tool/issues/30 我在这里留了微信了,不过设置了隐私,麻烦加的时候 issue 回复一下,或者留下大佬的联系方式,我来加你
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     1304 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 29ms UTC 17:11 PVG 01:11 LAX 09:11 JFK 12:11
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86