OpenSSL 与 GPG 加密异地备份?

在将存档推送到异地备份位置之前,可以选择使用 GPG 和 OpenSSL 进行本地加密,那么每种解决方案的优缺点是什么?

背景: 我目前管理一个基于 Ubuntu 14.04.1的服务器基础设施,当它们可用时,所有当前的补丁都应用了。

所有这些系统都是无头的,使用经过审查的预种子和自动化工具自动构建,并通过基于 Intel 的统一硬件的 KVM 在虚拟机中运行。

我们更喜欢 Ruby,但更喜欢“正确地做事”。由于这两个原因,我们选择了“备份”gem 作为创建我们想要保存的数据的加密存档的方法,因为它将为使用 Vagrant 的开发人员创建与生产中相同的加密存档,而不管它传输的机制如何。

所有的软件和配置都是通过 Puppet 进行管理的,因此这两个决策都不会对“用户体验”或方便性产生任何影响。任何一个选项都将创建相关脚本来管理、验证或还原所创建的任何备份。

鉴于此,任何一种加密选项在用于此目的时是否相对于另一种加密选项具有任何优势?

36335 次浏览

我会选择 GPG 文件加密,它有几十年的安全测试加密,并且很容易有多个“收件人”(备份密钥?)或使用其公钥甚至服务器的签名(如果它们有用的话)。

在 GPG 中,所有简单的错误都被避免/修复了,它为实际的加密选择了一个更长的“随机”密钥,并进行了大量的“循环”以使其非常安全。

OpenSSL 应该可以做所有相同的事情,(它从1998年开始使用,但是如果版本号有任何意义的话,它在2010年就达到了版本1)但是很容易出错,这会大大降低安全性。从 这篇关于 security.stackexchange.com 的文章(从2013年1月开始)到159K 声誉用户的 还有另一个openssl enc命令可能会留下一些需要改进的地方:

OpenSSL 使用的加密格式是非标准的: 它是“ OpenSSL 所做的”,如果所有版本的 OpenSSL 都趋向于彼此一致,那么除了 OpenSSL 源代码之外,仍然没有描述这种格式的参考文档。报头格式相当简单:

Magic 值(8字节) : 字节53616c 7465645f 5f Salt 值(8字节)

因此,一个固定的16字节的头部,从字符串“ Salted _ _”的 ASCII 编码开始,然后是 salt 本身。仅此而已!没有加密算法的迹象,你应该自己保持跟踪。

将密码和 salt 转换为密钥和 IV 的过程没有文档说明,但是查看源代码可以看出,它调用了 OpenSSL 特定的 EVP _ BytesToKey ()函数,该函数使用一个定制的 密钥导出函数并进行一些重复散列。这是一个非标准的、经过严格审查的构造(!)它依赖于声誉可疑的 MD5散列函数(! !); 该函数可以在命令行上用 非法移民 -md标志更改(! !); “迭代计数”由 enc命令设置为 1,不能更改(! ! !).这意味着密钥的前16个字节等于 MD5(密码 | | salt),就是这样。

这太弱了!任何知道如何在 PC 上编写代码的人都可以尝试破解这种方案,并且每秒钟可以“尝试”数千万个潜在的密码(使用 GPU 可以实现数亿个密码)。如果您使用“ openssl enc”,请确保您的密码具有非常高的熵!(即高于通常的推荐值; 目标至少为80位)。或者,最好根本不使用它; 相反,使用更健壮的东西(GnuPG在对密码进行对称加密时,使用更强大的 KDF,并对底层散列函数进行多次迭代)。

man enc甚至在“ BUGS”一栏下面也有这样的内容:

应该有一个允许包含迭代计数的选项。