Lin*_*eak 15 encryption openssl
今天,我在更新了一些软件包后,在 Cygwin 中收到了 OpenSSL 发出的警告,我相信openssl其中包括:
*** 警告:使用了不推荐使用的密钥派生。
使用-iteror-pbkdf2会更好。
Cygwin中使用的OpenSSL 版本是:
OpenSSL 1.1.1b 26 Feb 2019
Run Code Online (Sandbox Code Playgroud)
这是在我在Linux Mint 19.1上创建的 BluRay 上解密备份时发生的,其中OpenSSL 版本明显较旧:
OpenSSL 1.1.0g 2 Nov 2017
Run Code Online (Sandbox Code Playgroud)
用于加密和解密的命令(只需添加-d到末尾)是:
$ openssl enc -aes-256-cbc -md sha256 -salt -in "${InputFilePath}" -out "${OutputFilePath}"
Run Code Online (Sandbox Code Playgroud)
这个警告是什么意思,我能做些什么来避免在以后的备份中出现吗?
Lin*_*eak 16
比较 OpenSSL 的两个主要版本和最新版本的 Synopsys,让我引用手册页。
Run Code Online (Sandbox Code Playgroud)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 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 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 算法来派生密钥。
小智 11
最近我安装了最新版本的cygwin。“openssl”开始发出警告:
*** WARNING : deprecated key derivation used.
Using -iter or -pbkdf2 would be better.
Run Code Online (Sandbox Code Playgroud)
所以现在我使用以下内容进行加密:
openssl aes-256-cbc -salt -pbkdf2 -in name -out name.aes
Run Code Online (Sandbox Code Playgroud)
以及以下用于解密:
openssl aes-256-cbc -d -salt -pbkdf2 -in name.aes -out name
Run Code Online (Sandbox Code Playgroud)
听起来 OpenSSL 终于在至少 6 年之后承认该enc命令存在一些相当严重的缺陷(他们自己的手册页称它们为“bug”)。也许它们现在正在修复,但如果您的数据非常重要,为什么不使用(相对)更安全的工具(例如GnuPG)呢?您也不一定需要使用公钥加密,gpg 也可以进行传统的(仅密码/密钥文件)加密。
这是我的其他答案的摘录,强调了基础知识:
\n\n\n\n\nOpenSSL应该能够完成与 gpg 相同的所有操作(OpenSSL 自 1998 年以来一直存在,但如果版本号有什么意义的话,它在 2010 年达到了版本 1),但很容易犯一个错误,这可能会大大降低安全。从security.stackexchange.com 上的这篇文章(2013 年 1 月开始)和287K 信誉用户的另一篇文章来看,该
\n\nopenssl enc命令可能还有一些不足之处:\n\n\nOpenSSL 使用的加密格式是非标准的:它是“OpenSSL 所做的”,如果 OpenSSL 的所有版本都趋于彼此一致,那么除了 OpenSSL 源代码之外,仍然没有描述这种格式的参考文档。标头格式相当简单:
\n\nRun Code Online (Sandbox Code Playgroud)\n\nmagic value (8 bytes): the bytes 53 61 6c 74 65 64 5f 5f\nsalt value (8 bytes)\n因此,固定的 16 字节标头以字符串“Salted__”的 ASCII 编码开头,后面是盐本身。就这样 !未注明加密算法;你应该自己跟踪这一点。
\n\n密码和盐转换为密钥和 IV 的过程没有记录,但查看源代码表明它调用 OpenSSL 特定的EVP_BytesToKey()函数,该函数使用自定义密钥派生函数和一些重复哈希。这是一个非标准且未经充分审查的构造 (!),它依赖于信誉可疑的 MD5 哈希函数 (!!);该函数可以在命令行上使用未记录的
\n\n-md标志进行更改(!!!);“迭代计数”由命令设置enc为1并且无法更改 (!!!!)。这意味着密钥的前 16 个字节将等于MD5(password||salt),仅此而已。这实在是太弱了!任何知道如何在 PC 上编写代码的人都可以尝试破解这种方案,并且每秒能够“尝试”数千万个潜在密码(使用 GPU 可以实现数亿个密码)。如果您使用“openssl enc”,请确保您的密码具有非常高的熵!(即高于通常推荐的值;至少目标为 80 位)。或者,最好根本不使用它;相反,寻求更强大的东西(GnuPG在对密码进行对称加密时,使用更强大的 KDF 和底层哈希函数的多次迭代)。
\n\n\n
man enc甚至在“BUGS”下也有这个:\n\n应该有一个选项允许包含迭代计数。
\n
第一篇文章的评论之一甚至提到这些问题已经存在了近 10 年......
\n\n\n\n\n这个迭代计数问题确实很麻烦。大约 10 年前,我制作了一个“加密”perl 脚本,其功能与“openssl enc”基本相同,但使用迭代 PBKDF2 哈希。ict.griffith.edu.au/anthony/software#encrypt 它将解密加盐的“openssl enc”文件,但使用 PBKDF2 重新加密。我希望 OpenSSL 文件加密现在已经有所改进!\xe2\x80\x93安东尼2 月 7 日 5:05
\n
这是使用 gpg 进行对称加密的示例。
\n简而言之:
gpg --symmetric --cipher-algo AES256 --output file.gpg file.txt\nRun Code Online (Sandbox Code Playgroud)\n\n和
\n\ngpg --decrypt --output file.txt file.gpg\nRun Code Online (Sandbox Code Playgroud)\n
| 归档时间: |
|
| 查看次数: |
29284 次 |
| 最近记录: |