V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
zurmokeeper
V2EX  ›  程序员

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

  •  
  •   zurmokeeper ·
    zurmokeeper · 113 天前 · 3870 次点击
    这是一个创建于 113 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

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

    第 1 条附言  ·  113 天前
    其实我是想用 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  
       113 天前
    SWALLOWW
        2
    SWALLOWW  
       113 天前   ❤️ 3
    换个思路,导出个加密的压缩包?
    zurmokeeper
        4
    zurmokeeper  
    OP
       113 天前
    @asdjgfr 没有的,这个加解密都不支持的
    zurmokeeper
        5
    zurmokeeper  
    OP
       113 天前
    @yesterdaysun 都看过了,不支持 xls 格式的加密
    zurmokeeper
        6
    zurmokeeper  
    OP
       113 天前
    @SWALLOWW 还是想实现 xls 自己的加密,就像 WPS 保存 xls 格式的设密码一样,其实我已经实现了一部分,但是加密以后的文件和 WPS 加密出来还有少量字节数据的差异,不知道哪里不对,所以想找其他资料对比一下
    yesterdaysun
        7
    yesterdaysun  
       113 天前
    wxyrrcj
        8
    wxyrrcj  
       113 天前
    wxyrrcj
        9
    wxyrrcj  
       113 天前
    // 把工作薄输出到字节里面
    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  
       113 天前
    再转下 xls 不知道行不行
    zurmokeeper
        11
    zurmokeeper  
    OP
       113 天前
    @wxyrrcj 不行,xls 不是用 EncryptionMode.agile 加密的,这个是 xlsx 格式用的,xls 有自己的加密算法
    zurmokeeper
        12
    zurmokeeper  
    OP
       113 天前
    @yesterdaysun 商业的我看不到源码,说是有个 openxls 的开源版,却一直没找到源码
    ShirOvO
        13
    ShirOvO  
       113 天前
    easyexcel 里面我是使用的
    public void afterSheetCreate(
    WriteWorkbookHolder writeWorkbookHolder, WriteSheetHolder writeSheetHolder) {
    // 设置保护密码
    writeSheetHolder.getSheet().protectSheet("123456");
    }来设置密码,刚才试了一下 xls 格式,也是可用的
    zurmokeeper
        14
    zurmokeeper  
    OP
       113 天前
    @ShirOvO 你这个只是单元格的保护,不是整个文件的保护,发不了图片有点尴尬
    ShirOvO
        15
    ShirOvO  
       113 天前
    @zurmokeeper #14 你是需要密码才能打开 excel 吗?
    zurmokeeper
        17
    zurmokeeper  
    OP
       112 天前
    @ShirOvO 我是需要把一个 xls 用密码加密以后导出,WPS 和 office 都是支持的,然后打开的时候输入密码才能打开
    zurmokeeper
        18
    zurmokeeper  
    OP
       112 天前
    @victorting 这个只支持 xlsx 格式,不支持 xls 的
    ShirOvO
        19
    ShirOvO  
       112 天前
    @zurmokeeper #17 这样的 xiao'guo'ma 效果吗?导出的 xls 格式的
    cheng6563
        20
    cheng6563  
       112 天前
    xls 就是这样的,无标准,那几个字节自己猜吧。
    zurmokeeper
        21
    zurmokeeper  
    OP
       112 天前
    @ShirOvO 是的,在 MS office 上是这样的
    zurmokeeper
        22
    zurmokeeper  
    OP
       112 天前
    @cheng6563 不是吧,那岂不是所有做这方面应用的,比如收费的 WPS ,sheetjs 收费版还有一些收费的软件,都得去猜,这样怎么互相做兼容?
    ShirOvO
        23
    ShirOvO  
       112 天前
    @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  
       112 天前 via Android
    对啊,wps 对 ms 就是会在一些小细节上有一些奇奇怪怪的兼容问题,只是 wps 有能力研发去解决而已,他们自己也以此标榜……再看很久以前的 openoffice 项目的兼容性那就是一团糟
    markss
        25
    markss  
       112 天前
    xls2xlsx 在对 xlsx 进行加密是否可以满足要求?
    zurmokeeper
        26
    zurmokeeper  
    OP
       112 天前
    @ShirOvO 不知道 v 站这里能发文件,大佬可以 https://github.com/zurmokeeper/officecrypto-tool/issues/17 在这个 issue 这里,把你用 easyexcel 加密生成以后的 excel 上传一下吗?
    zurmokeeper
        27
    zurmokeeper  
    OP
       112 天前
    @markss 不行,我只是想实现 xls 格式的加密,xlsx 格式的加密已经实现了。不过请问下你说的 xls2xlsx 有具体的实现吗?是说找个工具把 xls 先转成 xlsx ,然后再对 xlsx 去加密?
    ShirOvO
        28
    ShirOvO  
       112 天前
    @zurmokeeper #26 已上传,你可以看看是否符合要求
    zurmokeeper
        29
    zurmokeeper  
    OP
       112 天前
    @caomu 哭死,这就是那么多不同语言的 excel 开源项目,没有一个实现 xls 加密的原因吗?
    zurmokeeper
        30
    zurmokeeper  
    OP
       112 天前
    @ShirOvO 感谢,我去看看
    markss
        31
    markss  
       112 天前
    试了下,libreoffice gui 保存 xls 文件时候可以选择输入密码,不过命令行 password 参数没有找到相关的文档。
    zurmokeeper
        32
    zurmokeeper  
    OP
       112 天前
    @ShirOvO 破案了,虽然导出的文件格式虽然是 xls ,但是本质上是个 xlsx 文件,只是把后缀改成 xls 导出而已,我看加密的方案用的都是 xlsx ,我把你上传的文件解密以后就是一个 xlsx 格式的内容,之前我看下 easyexcel 的源码,他的加解密都是基于 poi 实现的,poi 不支持它也不支持
    ShirOvO
        33
    ShirOvO  
       112 天前
    @zurmokeeper #32 我只是忘了更改 content-type 这个可以更改的
    zurmokeeper
        34
    zurmokeeper  
    OP
       112 天前
    @markss 大佬可以在这里贴下截图吗? https://github.com/zurmokeeper/officecrypto-tool/issues/17 ,或者帮忙加密保存一个 xls 格式的文件,帮忙贴一下。我之前看了下 libreoffice 在 github 上的源码,我只隐约看到可能有 doc 格式的加密,但是没有发现 xls 加密的代码
    lambdaq
        35
    lambdaq  
       112 天前
    @zurmokeeper xlsx 的加密好像就是直接 zip 加密。。。。
    zurmokeeper
        36
    zurmokeeper  
    OP
       112 天前
    @ShirOvO 大佬,可以再帮忙设置一下,再导出一个 xls 格式的?上传到刚才那个地址吗?我这边 java 环境一直有问题。
    zurmokeeper
        37
    zurmokeeper  
    OP
       112 天前
    @lambdaq xlsx 也不是,也有自己的加密算法,这个已经实现,大佬有兴趣可以看看 officecrypto-tool 的实现
    lambdaq
        38
    lambdaq  
       112 天前
    @zurmokeeper 你实现了每个表单的加密吗?这个好像就麻烦一点。
    shuax
        39
    shuax  
       112 天前
    猜不到就逆向……
    ShirOvO
        40
    ShirOvO  
       112 天前
    @zurmokeeper #36 已上传
    markss
        41
    markss  
       112 天前
    @zurmokeeper 粘贴了
    zurmokeeper
        42
    zurmokeeper  
    OP
       112 天前
    @lambdaq 关于 xlsx 格式的加密,微软有给一些文档,同时社区很多语言都有实现,比如 py 的 msoffcrypto-tool 等,所以这个比较简单
    zurmokeeper
        43
    zurmokeeper  
    OP
       112 天前
    @shuax 现在就是在逆向,但是就是还有一些字节数据,一直加密不对,导致最后始终加密不成功,不知道是哪几个字节出了问题
    zurmokeeper
        44
    zurmokeeper  
    OP
       112 天前
    @markss 感谢,我看看
    zurmokeeper
        45
    zurmokeeper  
    OP
       112 天前
    @ShirOvO 感谢,我看看
    markss
        46
    markss  
       112 天前
    @zurmokeeper
    单看了下 libreoffice 应该在这个目录下面:
    sfx2/source/doc ole 三品类相关的应该都有
    ShirOvO
        47
    ShirOvO  
       112 天前
    @zurmokeeper #45 有突破吗?
    zurmokeeper
        48
    zurmokeeper  
    OP
       112 天前
    @ShirOvO 刚忙其他了,简单看了下的确是 xls 格式的加密,但是有点奇怪用 WPS 能打开,但是用我自己的 officecrypto-tool 却报密码错误,不知道是哪里有问题,还要再看看
    zurmokeeper
        49
    zurmokeeper  
    OP
       112 天前
    @markss libre_123.xls 的确是加密成功了,也能正常解,不知道是不是我哪里看漏了,得好好看下源码
    zurmokeeper
        50
    zurmokeeper  
    OP
       112 天前
    @ShirOvO 大佬可以把完整的导出加密的代码贴一下到 github issue 吗?我不是很懂 java ,后续得慢慢研究 debug
    ShirOvO
        51
    ShirOvO  
       112 天前
    @zurmokeeper #50 已贴
    zurmokeeper
        52
    zurmokeeper  
    OP
       112 天前
    @ShirOvO 感谢,现在我的 officecrypto-tool 也可以解密,刚我手动改了源码出问题了,有兴趣一起研究下吗?
    ShirOvO
        53
    ShirOvO  
       112 天前
    @zurmokeeper #52 只是我没学过 nodejs ,不过对此也有兴趣,可以加个联系方式
    jenson47
        55
    jenson47  
       112 天前
    除了 excel 之外,其实 word 也可以使用,正如 #35 楼所说的,我认为是 tar 包加密,实际上 word ,excel 之前就是个 tar 包
    加密实现可以参考这个
    https://github.com/nick322/secure-spreadsheet
    zurmokeeper
        56
    zurmokeeper  
    OP
       112 天前
    @lysShub 这个只是 xlsx 格式的加密,不是 xls 的,算法实现不一样
    zurmokeeper
        57
    zurmokeeper  
    OP
       112 天前
    @jenson47 xlsx, docx, pptx 本质上是个 zip ,就是新的 ooxml 格式,但是 xls ,doc, ppt 这些老的格式不一样,加解密的算法不一样,这个我看了是 xlsx 的
    zurmokeeper
        58
    zurmokeeper  
    OP
       112 天前
    @ShirOvO https://github.com/zurmokeeper/officecrypto-tool/issues/30 我在这里留了微信了,不过设置了隐私,麻烦加的时候 issue 回复一下,或者留下大佬的联系方式,我来加你
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   4894 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 05:39 · PVG 13:39 · LAX 21:39 · JFK 00:39
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.