问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

java如何读取一个加密后的.xls文件

发布网友 发布时间:2022-04-23 20:57

我来回答

2个回答

热心网友 时间:2023-07-11 00:48

近日来,研究了一下Excel Biff8(xls 97-2007)与OpenXML(ECMA-376)的加密文档的读取(这还是为了我们世界先进Grid而做的 ^__^)。有些成果,写在这里,希望能给要做类似功能的XD们一些参考。
如有不详,请联系:Owen.Liu@GrapeCity.com / J2.NETe@gmail.com
前提:
1. 加密文档:指Wookbook级的加密,就是在Save Excel文档时在General Settings中设置open password之后的文档;
2. 打开:需要用户传入密码。并非破解。但请勿将本文方法添加暴力模块使用 :-) ;
3. 本文涉及较多为,密钥计算,关于解密细节请参考微软相关文档;
使用的加密算法: RC4, SHA1, MD5, AES-128(其中RC4并不包含在所有版本的.NET Framework中,AES算法可以在.NET Framework 3.5中找到)
本文示例依赖 .NET Framework 3.5

A. Biff8 的加密文档读取
1. 通过文档中FILEPASS的record取得,文档的加密信息(关于Biff文档的格式问题,请参阅Biff的微软文档)
其中Biff8可以使用两种方法加密:Biff8标准加密算法和Biff8扩充加密算法。本文主要讨论最常用的Biff标准加密算法
2. 通过FILEPASS的结构,获得如下信息:
salt(加密随机数,16 bytes)
password verifier (密码效验器,16 bytes)
password verifier hash(密码效验器Hash,16 bytes)
3. 通过以上信息,生成解密key。并通过密码效验器,验证密码:
i. 将密码转化成unicode数组,并进行MD5 Hash;
ii. 将hash结果与salt串联,然后将byte数组,反复串联16次(336 bytes) ,然后再进行MD5 Hash;
iii. 将上步hash结果的前五位,串联上4 bytes的block值(在密码验证阶段为0,在以后解密阶段为block的index) ,然后进行MD5 Hash;
iv. 将上步hash结果的前16位,作为key
v. 使用RC4对称加密算法,将password verifier和password verifier hash分别解密,然后对password verifier的解密结果进行MD5 hash,其值应和password verifier hash的解密结果一致,即为密码正确。
vi. 之后进行逐个record的解密。excel biff8加密原则基本为,record的标示不加密,长度不加密,个别record不加密(见文档);另外,在record解密时,还需要通过block的值重新计算解密key,block的大小为1024.
4. 详细请参照示例代码;

B. OpenXML(ECMA-376) 加密文档的读取
1. 通常来说,xlsx文件相当于一个zip文件,可以用zip程序,直接打开。而在加密后,为了安全性考虑,微软使用了 structured storage(一种OLE文档存储方式)存储(可以用7-zip或者OLE document viewer打开,windows也有相应API来操作此类结构)。在上述文档中,有一个叫做“EncryptedPackage”加密的package,就是一个zip包通过AES算法进行加密之后的结果。我们将使用和A一样的方式来检查密码,但生成key的方法不同;OpenXML的加密类型也有多种,我们这里就讨论常用的用AES-128进行加密的流程;
2. 通过文档的“EncryptedInfo”部分,需要过的一下信息(关于此部分的结构,请参考[MS-OFFCRYPTO].pdf)
salt(加密随机数,16 bytes)
password verifier (密码效验器,16 bytes)
password verifier hash(密码效验器Hash,32 bytes)
3. 通过以上信息,生成解密key。并通过密码效验器,验证密码:
i. 首先,定义一个H函数,其有两个输入,内部使用SHA1算法将两个输入串联之后的结果hash返回;
ii. 先将salt与password(password的unicode数组)进行H计算,h = H(salt, password) ;
iii.然后设iterator为0x00000000,将其转为4byte的数组,然后进行H计算,h1 = H(iterator, h);
iv.将上面的iterator递增一,然后再与h1进行H计算,h2 = H(iterator,h1),然后将这个递增和计算过程重复50000次,最后计算过的iterator为49999即可;
v. 现在有计算结果h50000,将h50000再与0x00000000(4 byte数组)进行H计算,Hfinal = H(h50000, 0x00000000);
vi. 生成一个64byte的数组,将每位都初始化成0x36,然后将这个数组与Hfinal异或;(关于这个地方,微软文档中写的有错误,按照原文的方法生成的key不正确,要不是文档的作者回信告诉我要使用这个法子,就算我想破头也想不出来啊 T__T)
vii.将异或结果,进行SHA1 hash,结果的前16byte就是解密的key;
viii.初始化AES算法,key长度为128,模式为ECB模式,Padding为none; 然后将password verifier 和password verifier hash分别解密;
ix. password verifier 解密后的SHA1 hash结果应该与password verifier hash解密后的前20byte相同;
4. 关于"EncryptedPackage" 的解密则更为简单,只许将“EncryptedPackage”读入,去除前8byte的size信息后,进行AES解密,即为未加密的标准openxml文档。

参考:
[MS-OFFCRYPTO].pdf
[MS-XLS].pdf
ECMA-376 standards

Reply by "winnow", 2008-09-10, 1:17
-----------------------------------------------------
总结一下, 关于这两种基于密码的加密方法, 基本上都是基于RFC2898 建议, 思想是这样:
输入是用户的密码:password, 输出是提供给加密函数的密钥:key.
考虑安全, 需要使同样的password生成的key不一样, 这样用相同的password加密后的结果就无法比较. 需要一个随机数salt.
另外, 为了使暴力破解的代价增大, 考虑使用一个循环多次的过程, 需要循环次数:iteration_count.
概念上, 生成方法为: 将password和salt进行某种运算, 配合一个Hash函数, 以某种方式循环iteration_count次, 在最后的结果里取一部分作为key输出.
具体参照RFC2898中的建议方法PBKDF1和PBKDF2.
这样, 用户输入的密码与一个随机数组合, 经过一定代价的运算, 就生成了可以供加密函数使用的密钥. 使用这个密钥和一个加密函数, 就可以进行加密了.

在应用中, 为了快速判断密码是否错误. 生成一个随机数verifier, 用一个Hash函数计算verifier的hash值:verifier_hash, 分别加密verifier和verifier_hash并保存.
解密的时候, 先分别解密出verifier和verifier_hash, 计算verifier的hash值, 与verifier_hash比较, 如果一致, 即说明密码正确.

热心网友 时间:2023-07-11 00:49

首先你这个Excel文件是从哪里来的,很可能是从一个页面上下载来的,而这个页面做的功能就是导出Excel,但做偷懒了,没有用jxl和POI等库,而是用直接用jsp生成html写的。

因此你上传时就要要判断了,如果是真的excel就要用jxl或POI解析,如果只是html,就要用HTML的解析方法了。
java如何读取一个加密后的.xls文件

1. 通过文档中FILEPASS的record取得,文档的加密信息(关于Biff文档的格式问题,请参阅Biff的微软文档)其中Biff8可以使用两种方法加密:Biff8标准加密算法和Biff8扩充加密算法。本文主要讨论最常用的Biff标准加密算法 2. 通过FILEPASS的结构,获得如下信息:salt(加密随机数,16 bytes)password verifier (...

java中怎么对同一个文件读取两次或以上,用io

读取一个文件,把文件的内容缓存起来(用List,或者StringBuilder等等的容器)。然后读取另一个文件,再把内容缓存到同一个容器里面。直到最后一个文件读取完毕。我在对这个缓存内容的容器进行处理。但是这个可能会越界...或者可以试试把第一个文件的内容写入缓存,然后读第二个文件时把第一个文件的内容写入...

java有没有那个方法 获取文件保存的编码方式啊?

正常的方法是当你读取一个文件时,应该有人已经告诉了你这个文件是字符集是什么。这个过程应该是人工决定的,比如人们把它写在一个配置文件中,或者约定了整个软件只使用 UTF8 或 GBK 一种编码方式。作为一个通用型的软件推荐使用 UTF8 而不是 GBK,因为当你保存一个人名时你也知道这片神奇的土地上...

对Java程序中的一个.xml 配置文件进行加密 如何实现? 程序正常运行_百度...

可以写一个xslt文件,对xml进行模板处理,也就是把你xml写成冗余的东西,使用xslt进行精炼得到你想要的xml

java FileFilter 过滤只保留文件夹和.xls文件

import java.io.File; import java.io.FileFilter; public class Test { public static void main(String[] args) { File file = new File("E:\\"); File[] files = file.listFiles(new FileFilter(){ @Override public boolean accept(File pathname) { // 判断文件名是目录 或 .xls 结尾 if (pathna...

怎么用JAVA给生成的EXCEL加密

// Option 1: remove password Biff8EncryptionKey.setCurrentUserPassword(null);OutputStream os = new FileOutputStream("decrypted.ppt");hss.write(os);os.close();...// Option 2: change encryption settings (experimental)// need to cache data (i.e. read all data) before changing ...

请问用java如何对文件进行加密解密?

/** * 加密--把加密后的byte数组先进行二进制转16进制在进行base64编码 * @param sSrc * @param sKey * @return * @throws Exception */ public static String encrypt(String sSrc, String sKey) throws Exception { if (sKey == null) { throw new IllegalArgume...

文件加密后怎样才能打开

文件加密分为两类,一种是密码口令加密,就是在保存文件的时候设置打开密码,下次打开文件时需要正确输入打开密码就可以正常使用文件了。这种口令加密一般需要设置8位以上,否则很容易爆破。第二种是采用加密软件进行加密的文件,在装有加密软件的计算机上打开密文和打开明文一样简单,不需要输入密码。在其他...

JAVA实现EXCEL加密

加密用到 HSSFWorkbook的writeProtectWorkbook方法。具体实现如下:package excel;import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.IOException;import org.apache.poi.hssf.usermodel.HSSFWorkbook;public class Writer { public static final String FILE = "./workbook.xls";...

如何在Java中加密和解密zip文件?

学习如何使用Zip4j库在Java中加密和解密zip文件,让我们先添加依赖关系到pom.xml文件。使用ZipFile addFile()方法压缩文件到受密码保护的zip文件中。setCompressionLevel可选,从FASTEST到ULTRA级别,默认为NORMAL。选择AES加密,使用ZIP_STANDARD替换可实现Zip标准加密。确保文件存在,否则抛出异常。记得关闭资源...

java读取excel文件 xls文档加密如何破解 java读取xlsx java将xlsx和xls互转 java导出xls和xlsx java将xls转换成xlsx xls文件密码解密 java解析excel文件 java导出xlsx
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
如果一个男人有很多优点,但是同时有一下的一些缺点,你们说能交往吗?作... 优点往往也是缺点,如真爱请照单全收 这个怎么用还有里面有一小包好像白糖一样的东西? ...学院哪个好呢?尤其是对外交流方面?若想考清华大学经济法硕士需要看那... 国家商务部拿到直销牌照企业有多少家? 介绍:雪菊茶有什么功效 长期喝雪菊茶的好处有哪些 ...泡完发白,而且有很大的刺鼻气味,是不是硫磺熏过,要不要吃了_百度... 女朋友的眼里只有他的朋友而我算什么 我把她当女朋友,她把我当普通朋友,我到底算什么啊 如何使用只使用HTML和CSS的流程图/图 CSS 的预处理程序分别都有哪些优缺点 thinkpad如何用指纹识别加密文件和程序? 用什么工具可以查看加密的文件? 如何和何时使用CSS的,important 原手机开不了机了,存储卡的加密文件怎样读取? CSS+DIV网页制作的一般思路和过程是什么样的呢? 如何使用加密文件夹的文件 高跟王国Jimmy Choo的全新平底鞋是否也能称王国 css div布局的基本步骤 如何查看加密的文件? 如何用指纹识别器单独加密一个文件或者文件夹? 什么是css呀?这个文件用什么语言编呀? 在老公的陪伴下,光腿穿大衣的孟晚舟看起来有多自信优雅? 我有一个文件夹,文件夹可以打开,但文件内容需要密码~请问该如何读取文件加密的内容 在设计视图下,创建CSS的步骤是什么 尖头高跟鞋用英语怎么说 怎样识别文件夹嗅探器检测的加密文件 css怎么运行 JS加密后的文件浏览器可以直接识别吗? html+css做一个网页 是不是先要写出每个div的宽和高 文件加密了,怎么能读取加密文件, 系统是重装的, 文件名称变绿色,求解决 如何在Dreamweaver中设置CSS样式,具体过程怎么操作? 怎么打开加密的文件/怎么打开加密的文件 css布局方式有哪些,具体是什么意思 怎样读取excel表格加密文件 简述css+dlv的步骤 如何用人脸识别软件给文件夹加密? HTML+CSS写前台的步骤是怎样的?内详。 电脑文件怎样加密,,使只有自己才能读取,操作,,谢谢了 微信申诉达上限怎么办? 哪些是高蛋白的食品 高蛋白食品有那些种类? 2O16年特岗教师转正需要那些条件 特岗教师工作三年的年终考核表算不算转正定级材料? 河南南阳特岗教师转正审批材料 特岗教师转正申请书 特岗教师转正一定要教师资格证吗? 谁知道特岗教师综合评价材料怎么写? 特岗教师转正手续好办吗?怎么办?