我应该如何根据 *** WARNING : deprecated key derivation used 更改加密

Tom*_*lák 35 encryption openssl

当我加密或解密文件时,我得到 *** WARNING : deprecated key derivation used. Using -iter or -pbkdf2 would be better.

我不明白这意味着什么,我应该如何更改我的程序。你可以帮帮我吗?我用加密openssl des3 <input >output.des3和解密 openssl des3 -d <input.des3 >output

关于环境

Ubuntu 18.10

~$ openssl version OpenSSL 1.1.1 11 Sep 2018

小智 24

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

OpenSSL 1.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]
Run Code Online (Sandbox Code Playgroud)

OpenSSL 1.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]
Run Code Online (Sandbox Code Playgroud)

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

  • pbkdf2

  • iter


你现在基本上有两个选择。忽略警告或将您的加密命令调整为:

openssl enc -aes-256-cbc -md sha512 -pbkdf2 -iter 100000 -salt -in InputFilePath -out OutputFilePath
Run Code Online (Sandbox Code Playgroud)

这些开关的位置:

  • -aes-256-cbc是您应该使用的最大保护还是 128 位版本,3DES(三重 DES)不久前被放弃,请参阅 NIST 在 2017 年弃用了三重 DES,而所有现代 CPU 都大大加速了 AES;您可以简单地验证您的 CPU 是否具有AES-NI 指令集,例如使用grep aes /proc/cpuinfo赢,赢

  • -md sha512 与 SHA-256 相比,是 SHA-2 函数系列的更快变体,但它可能更安全一些;赢,赢

  • -pbkdf2: 使用PBKDF2 (Password-Based Key Derivation Function 2) 算法

  • -iter 100000 正在覆盖密码的默认迭代次数,引用手册页:

    在导出加密密钥时对密码使用给定的迭代次数。高值会增加对结果文件进行暴力破解所需的时间。此选项允许使用 PBKDF2 算法来派生密钥。

  • 那么,当使用`openssl enc -aes-256-cbc -md sha512 -pbkdf2 -iter 1000 -salt -in InputFilePath -out OutputFilePath`时如何解密。 (5认同)
  • 只需在命令中添加 `-d`:`openssl enc -aes-256-cbc -md sha512 -pbkdf2 -iter 1000 -salt -d -in InputFilePath` (4认同)
  • 我很确定这个建议存在一些问题。根据 https://en.wikipedia.org/wiki/Key_derivation_function,您需要密钥派生算法的 _slowest_ 变体。换句话说,不要使用 sha512 根据 https://en.wikipedia.org/wiki/PBKDF2`在 2000 年,推荐的最小迭代次数为 1000,但该参数旨在随着 CPU 速度的增加而增加增加` - 所以我建议迭代 10,000 到 100,000 次而不是 1000 次。 (2认同)

ant*_*ony 6

另一个答案基本上是正确的。尽管这些版本(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