如何检查 InputStream 7Z 存档文件是不是受密码保护?

Posted

技术标签:

【中文标题】如何检查 InputStream 7Z 存档文件是不是受密码保护?【英文标题】:How to check if an InputStream 7Z archive file is password protected or not?如何检查 InputStream 7Z 存档文件是否受密码保护? 【发布时间】:2021-10-24 02:21:47 【问题描述】:

我用过commons-compress-1.21.jar

File f = new File("/home/user/Desktop/test.7z");     
SevenZFile sevenZFile = new SevenZFile(f);
SevenZArchiveEntry entry = sevenZFile.getNextEntry();
sevenZFile.read();
sevenZFile.close();
inMemoryByteChannel.close();

这是识别给定 test.7z 密码保护与否的工作代码。在阅读时它正在抛出:

protectedjava.io.IOException: Cannot read encrypted files without a password
    at org.apache.commons.compress.archivers.sevenz.AES256SHA256Decoder$1.init(AES256SHA256Decoder.java:57)
    at org.apache.commons.compress.archivers.sevenz.AES256SHA256Decoder$1.read(AES256SHA256Decoder.java:118)
    at org.apache.commons.compress.utils.ChecksumVerifyingInputStream.read(ChecksumVerifyingInputStream.java:85)
    at java.io.DataInputStream.readFully(DataInputStream.java:195)
    at java.io.DataInputStream.readFully(DataInputStream.java:169)
    at org.apache.commons.compress.archivers.sevenz.SevenZFile.readEncodedHeader(SevenZFile.java:289)
    at org.apache.commons.compress.archivers.sevenz.SevenZFile.readHeaders(SevenZFile.java:191)
    at org.apache.commons.compress.archivers.sevenz.SevenZFile.<init>(SevenZFile.java:95)
    at org.apache.commons.compress.archivers.sevenz.SevenZFile.<init>(SevenZFile.java:117)
    at com.helloworld.ZipFileTest.main(ZipFileTest.java:45)

从这个异常中,我们可以确定这是受密码保护的文件。但我只有一个 7Z 文件的 InputStream。我没有文件也没有文件路径。

【问题讨论】:

【参考方案1】:

SevenZFile 可以接受SeekableByteChannel 作为参数。

只需从您的信息流中创建 SeekableInMemoryByteChannel

InputStream inputStream; // input stream
SeekableInMemoryByteChannel channel = new SeekableInMemoryByteChannel
       (IOUtils.toByteArray(inputStream));

Source

【讨论】:

首先我得到 java.lang.ClassNotFoundException: org.tukaani.xz.LZMAOutputStream 错误,一旦我添加了 xz-1.9.jar 其抛出的运行时异常 java.lang.SecurityException: 密封违规:包 org .tukaani.xz 已密封 创建新问题。解释你在做什么,你有什么库(带有版本),并添加完整的堆栈跟踪。如果没有准确的细节,就很难诊断出此类错误。

以上是关于如何检查 InputStream 7Z 存档文件是不是受密码保护?的主要内容,如果未能解决你的问题,请参考以下文章

在 7z 单文件存档中随机查找

命令行创建两个文件夹的 7z 存档和一个文件以自解压到指定位置

7zip 命令行 - 来自源文件名的存档名称

SharpCompress & LZMA2 7z 存档 - 特定文件的提取速度非常慢。为啥?备择方案?

sh 简单的sha256位加密存档用于保护重要文件,因为7z命令通常很难记住。

仅使用 7z 压缩文件而不保留路径