【问题标题】:How to use Rar or WinRAR for creating an encrypted archive with a password starting with a double quote?如何使用 Rar 或 WinRAR 创建密码以双引号开头的加密存档?
【发布时间】:2018-06-17 00:24:19
【问题描述】:

我正在尝试通过 Windows 7 中的命令行使用密码创建一个命令行以压缩为 RAR 文件。我已经安装了 WinRAR 5.31 x64。

以下命令对我有用:

rar a -r -m0 -hp"!(/!$!#!#=)\%" C:\files1.rar" *.*

密码是!(/!$!#!#=)\%

如果我想在密码中加上双引号",就会出现问题,例如在开头:

rar a -r -m0 -hp""!(/!$!#!#=)\%" C:\files1.rar" *.*

密码应该是"!(/!$!#!#=)\%

这对我不起作用,我尝试将 \ 放在 " 之前,但这也不起作用。

谁能指导我找出密码中的这个特殊字符?

【问题讨论】:

    标签: command-line special-characters rar winrar


    【解决方案1】:

    Windows 命令解释器cmd.exeRar.exe 本身决定在解析命令行时如何解释命令行中指定的参数。包含空格或其中一个字符&()[]{}^=;!'+,`~<|> 的参数字符串必须用双引号引起来。这使得将双引号字符作为参数字符串的一部分传递给控制台应用程序变得非常困难,尤其是在参数字符串的开头。

    但是对于这个由以直双引号字符开头的密码/密码短语引起的非常罕见且非常具体的问题,有一个解决方案,该字符通常标记参数字符串的开始/结束,其间的所有字符都按字面意思解释。

    WinRAR控制台版的说明书是WinRAR程序文件夹下的文本文件Rar.txt。在本手册中可以看到Rar.exe 支持从环境变量RAR 中读取开关。通过在 SET 命令行上使用此环境变量和 Windows 命令行解释器的特殊解析,可以从命令行创建 RAR 存档,密码以单个直双引号字符开头。

    @echo off
    setlocal EnableExtensions DisableDelayedExpansion
    set "RAR=-hp""!(/!$!#!#=)\%%""
    "%ProgramFiles%\WinRAR\Rar.exe" a -r -m0 -x"%~f0" "%USERPROFILE%\Desktop\files1.rar" *.*
    endlocal
    

    开关-hp 是从环境变量RAR 中读取的,以及手册中解释的直接在RAR 命令行上指定的其他开关。

    环境变量RAR 使用语法set "variable=value" 定义,Why is no string output with 'echo %var%' after using 'set var = text' on command line? 上的答案详细解释了这一点

    在 Windows 命令行中,需要将带有空格或其中一个字符 &()[]{}^=;!'+,`~<|> 的密码/密码用双引号括起来。出于这个原因,Rar.exe 从传递的密码/密码短语中删除第一个和最后一个双引号,如果在开头和/或结尾有一个。因此无法使用"!(/!$!#!#=)\% 定义密码。密码必须用两个额外的双引号使用""!(/!$!#!#=)\%" 定义,以让真正使用的密码以直双引号字符开头。

    在批处理文件中,% 标记环境变量引用的开始/结束,除非它被另外一个 % 转义。

    所以最后命令行set "RAR=-hp""!(/!$!#!#=)\%%"" 定义环境变量RAR 与开关-hp 将字符串"!(/!$!#!#=)\% 传递给Rar.exe 作为密码用于加密。

    RAR 压缩包files1.rar 是通过此代码在用户桌面上创建的,因为目录C: 的根目录通常是写保护的。

    注意:RarWinRAR 解释 *.** 不同,如手册中所述,与解释它们相同的 Windows 内核函数相比。 Rar 在使用*.* 时仅将文件名中包含点的文件添加到RAR 归档文件中。所以你最好只使用* 作为通配符。

    如果在执行批处理文件时将批处理文件存储在当前目录中,则开关-x"%~f0" 可防止将批处理文件也添加到 RAR 存档文件中。在命令提示符窗口call /? 中运行%~f0 的解释 - 参数 0 的全名,表示带有扩展名和完整路径的批处理文件名。

    【讨论】:

      【解决方案2】:

      Mofi 的进一步回答:

      特别是对于从命令行使用 winrar/rar 的 Linux 用户,可能值得意识到rar 有效地接受“密钥文件”,这可以克服在密码中使用引号的需要。

      Rar 记录的最大密码长度为 127 个字符/字节。 (对我来说)不清楚哪些字符是密码空间的一部分,但至少 base64 编码的字符串可以工作。但是,rar 目前使用基于 PBKDF2 的基于密码的密钥派生函数,该函数使用 HMAC-SHA256 哈希函数,其块大小为 512 位。根据PBKDF2,长于散列函数块大小的密码首先被预散列成 256 位的摘要,然后将该摘要用作密码(而不是原始密码)。致avoid 这个,您选择的存档密码不应超过 512 位或 64 个字符。

      在base64编码的字符串中,每个字符代表6位数据;因此,一个 64 个字符的密码相当于 384 个随机位,可以从 48 个随机字节派生而来。

      rar a -hp"$(dd if=/dev/urandom bs=48 count=1 | base64 -w0 | tee /tmp/pwd)" archive
      

      上面的dd-pipe 将从内核的(非阻塞)随机数源设备读取 48 个(伪)随机字节,将它们转换为 64 个字符的密码,告诉rar 使用该密码来导出256位(AES256)加密密钥(RAR5格式),同时将密码存储在文件`/tmp/pwd'中。

      可以再次访问存档,例如列出,通过从文件中读取密码,例如:

      rar l -p"$(cat /tmp/pwd)" archive.rar
      

      密码文件可以单独或与存档一起安全存储,在后一种情况下(当然)在加密后,例如gpg 使用您自己的公钥,以便将存档密码锁定在您的私钥/关键短语下。所有这些都是为了方便地利用rar的密码/密钥空间。

      我注意到我没有深入研究unrar 的公开源代码;以上仅基于一般文档。另外,我不知道上面是否可以在Windows下工作。

      【讨论】:

        猜你喜欢
        • 2011-09-06
        • 2013-03-09
        • 1970-01-01
        • 1970-01-01
        • 2017-07-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-04-23
        相关资源
        最近更新 更多