我应该如何根据 *** 警告:使用已弃用的密钥派生来更改加密

我应该如何根据 *** 警告:使用已弃用的密钥派生来更改加密

当我加密或解密文件时,我得到:

*** 警告:已使用弃用的密钥派生。
使用-iter-pbkdf2会更好。


我不明白这意味着什么,以及我应该如何改变我的程序。

到目前为止,我使用以下方式加密:

openssl des3 <input >output.des3

并使用以下方法解密:

openssl des3 -d <input.des3 >output

操作系统:Ubuntu 18.10

$ openssl version
OpenSSL 1.1.1  11 Sep 2018

答案1

比较 OpenSSL 两个主要版本和最新版本的 Synopsys,让我引用手册页。

OpenSSL1.1.0

openssl enc -ciphername [-help] [-ciphers] [-in filename] [-out filename] [-pass arg] [-e] [-d] [-a/-base64] [-A] [-k password] [-kfile filename] [-K key] [-iv IV] [-S salt] [-salt] [-nosalt] [-z] [-md digest] [-p] [-P] [-bufsize number] [-nopad] [-debug] [-none] [-engine id]

OpenSSL1.1.1

openssl enc -cipher [-help] [-ciphers] [-in filename] [-out filename] [-pass arg] [-e] [-d] [-a] [-base64] [-A] [-k password] [-kfile filename] [-K key] [-iv IV] [-S salt] [-salt] [-nosalt] [-z] [-md digest] [-iter count] [-pbkdf2] [-p] [-P] [-bufsize number] [-nopad] [-debug] [-none] [-rand file...] [-writerand file] [-engine id]

显然还存在一些更大的差异,即考虑到这个问题,1.1.0 中缺少这两个开关:

  • pbkdf2

  • iter


现在你基本上有两个选择。要么忽略警告,要么将加密命令调整为如下内容:

openssl enc -aes-256-cbc -md sha512 -pbkdf2 -iter 1000000 -salt -in InputFilePath -out OutputFilePath

这些开关的位置:

  • -aes-256-cbc是你应该为获得最大程度的保护,请使用 128 位版本;3DES(三重 DES)已被废弃,请参阅NIST 已于 2017 年弃用三重 DES,而 AES 在所有现代 CPU 上都得到了很大的加速;你可以简单地验证你的 CPU 是否具有AES-NI指令集例如使用grep aes /proc/cpuinfo赢,赢

  • -md sha512 与 SHA-256 相比,SHA-2 函数系列的速度稍快一些虽然它可能更安全一些;赢,赢但随着新的SHA 指令集在现代 CPU 中

  • -pbkdf2: 使用PBKDF2(基于密码的密钥派生函数 2)算法

  • -iter 1000000正在覆盖密码的默认迭代次数(即 10000),引用手册页:

    在导出加密密钥时对密码使用给定的迭代次数。值越高,暴力破解生成文件所需的时间就越长。此选项允许使用 PBKDF2 算法导出密钥。


迭代的默认值没有记录,但在apps/enc.c文件中指定如下:

case OPT_PBKDF2:
    pbkdf2 = 1;
    if (iter == 0)
        iter = 10000;
    break;

-d只需在原始命令行末尾添加开关即可进行解密。

答案2

另一个答案基本上是正确的。尽管这些版本(v1.1.0 和 v1.1.1)周围的其他内容已经发生了变化,但值得注意的是。

首先,默认密码哈希摘要已发生改变,从 md5 变为 sha512

其次,添加了“-pbkdf2”和“-iter”,这是长期以来一直需要的。但是默认迭代次数太低了,应该尽可能地设置高,而不会太烦人。对于加密和解密来说,足够大到需要 1 到 2 秒通常是可以接受的,但对于暴力破解密码来说却非常困难。

问题是,现在我们有了所有这些新选项和默认值,以及不同的摘要和密码,您需要记住所有这些选项,才能解密加密文件。也就是说,无论决定使用什么选项进行加密,都必须用于解密。但是,openssl 只存储一些“文件魔法”(例如文件开头的“Salted__”)以及加密文件中使用的随机“盐”。其他一切都留给您自己去记住!

Aespipe 是一个老程序,它通过将部分信息保存为加密数据的额外标头来解决这个问题,但现在它已经过时了,而且它的格式不允许使用新选项,也不便于扩展。

作为替代方案,我一直在创建一个新脚本“keepout”作为“openssl enc”的包装器,以保存记住如何解密该特定文件所需的额外选项,即使在加密时使用较新的选项、密码或更大的迭代。基本上,它会将所需的 openssl 选项与数据一起保存。

https://antofthy.gitlab.io/software/#keepout

相关内容