为什么很少(没有?)易于使用的加密库?

信息安全 密码学
2021-09-05 10:00:32

如果我搜索堆栈溢出以了解如何安全地加密数据,那么第一个命中就是某人的自定义加密方案。我在这个网站上看到了几个类似的问题,总的来说,它们都注定有严重的缺陷。大多数天真到甚至试图发明自己的加密的人都不知道有多少种方法可以搞砸它。

到这一步大家都点头了?

现在,让我感到惊讶的是,可能是因为我属于上面提到的天真人群,对于我们这些不了解的人来说,没有好的建议。虽然正确的答案可能是“不要在家里尝试这个”,但这并没有帮助。

需要生产就绪的 Web 服务器?有 Apache 和 Nginx。还是数据库?对于大多数不需要扩展到 Google/Facebook/Twitter 规模的用例,有太多的生产就绪选择可以解决您的问题,甚至没有必要列出它们。更复杂的东西?您可以想到的大多数语言都可以轻松获得高质量的机器学习库,并且可能还有更多。

想要加密一些东西?糟糕。

例如,假设我在 google 中搜索“ruby encrypt data”。我最终找到了OpenSSL Cipher 文档

有人可能会想,“太棒了,我听说一个人永远不应该发明自己的加密方案,这里有一段简单的复制/粘贴准备好的代码”,所以我可能会复制它,然后愉快地继续前进。

虽然我对这个主题的理解相当有限,但即使我也能看出一个巨大的缺陷:完整性这个词从未在任何地方提及。没有数据的 HMAC,因此应用程序最终容易受到攻击。

如果您对 php 进行类似的搜索,您可能很幸运能够收到有关完整性的警告,但没有可靠的解释说明为什么它很重要,也没有提到使用未处理的密码是不安全的,这与 ruby​​ 文档不同。

所以对于所有想要加密信息的开发人员来说,我们几乎注定会出错。

我确信复杂性有充分的理由,但它是什么?

4个回答

因为加密很复杂许多陷阱需要避免,如果你弄错了,可能会发生可怕的后果。我的一个问题的答案很好地探讨了一些原因。开发人员在密码学方面应该在什么抽象级别上工作?

也就是说,那里一些很好抽象的加密库。Fernet 库为RubyGo中的对称加密提供了一个易于使用的接口Keyczar库也有多种语言的实现。最后,我参与的一个项目的个人插件,python 的密码库旨在为高级加密配方和低级原语提供有关最佳实践的充足文档。

我同意你的观点,没有简单的解决方案。最近一个著名的例子是爱德华·斯诺登(Edward Snowden)无法教格伦·格林沃尔德(Glenn Greenwald)如何使用公钥加密工具。

故意(?)后门使景观变得更加危险。Apple、Linux 和 RSA 最近都因加密货币被破坏而成为新闻。

所以对于所有想要加密信息的开发人员来说,我们几乎注定会出错。

我不同意。虽然没有简单的解决方案,但有很多解决方案。Java 世界已经内置了经过验证的加密库以及第三方库,如 Bouncy Castle(包括 HMAC)。

您引用了您找到的库中缺乏消息完整性检查的情况。消息完整性(加密身份验证)是一个与加密通信密切相关但又相互独立的问题。许多图书馆两者兼而有之。如果加密库不支持它并且您需要它,那么它可能会在单独的库中找到。 关于 HMAC 的维基百科页面有一个多种语言的实现列表。

我想指出,按照既定方法自己实施消息完整性检查与发明自己的方法不同。就像我自己编写实现 SHA-256 的 java 代码一样,它不会算作我自己的滚动。该算法是真正经过审查和证明的发明,而不是实现。

正如您和其他人所指出的,加密很复杂。但更重要的是,安全性很复杂;而且这些问题不全是技术问题,也不能全部通过加密来解决。加密算法只是安全难题的一小部分。就其本身而言,加密仅解决了一个安全属性:机密性。还有其他因素需要关注,包括完整性、可用性、授权和不可否认性。

为了有用,加密必须在协议的上下文中执行。该协议准确地指定了哪些字节到这里,哪些字节到那里。如果加密正确但协议错误,则可能无法保护消息的完整性。该协议可以设计为保护消息的完整性,但这与加密不同。如果系统非常复杂,以至于您的任何一端的用户都无法使其工作,那么它就不可用。密钥管理仍然是最大的问题:如果你解决了加密、协议和复杂性,但你在密钥管理或密钥分发方面失败了,你就无法保护授权、不可否认性,甚至是完整性和机密性。不存在成功解决所有这些方面的加密库。

问题的另一部分是安全性是由没有成功的攻击来定义的——证明一个系统是安全的几乎是不可能的,因为不可能证明一个负面的。您可以测试正确的行为,但不能测试每个可能的不正确行为实例。对协议的新攻击来自于乱序重放消息、更改某些字节、更改操作顺序、更改消息版本号、重新排列字段等。更多的攻击即将到来。没有任何系统可以针对未知情况进行完美测试。

很大一部分问题是存在相互竞争的利益:如果我出售“SecuriFoo 2000,您的一体化安全解决方案”,我几乎没有经济动机使其与“Protect-O-Matic 8.1”兼容,我在业务中的直接竞争对手(想想 iMessage)。世界各地都有各种各样的加密法,在某些地方禁止某些类型的加密。让市场如此复杂和分散以致大多数普通人无法充分选择和使用受保护的通信,从而在可被截获的消息中留下不安全的裂缝,这符合政府机构的既得利益。

这个领域根本不成熟。练习者每天都在学习新事物,而攻击者也每天都在尝试新事物。只要可以从破坏安全中获得价值,人们就会不断尝试破坏它。

这不是一个完整的答案,但似乎已被其他答案跳过的一点(John Deters 谈到了它,但从一个非常不同的角度解决了它)是这样的:

通常加密的目的是封装一些可以解密或验证的信息。编写一个非常易于使用的库是很有可能的,它提供了加密和解密功能。例如,请参阅thia Javascript TEA 实现,它具有 2 个功能:加密和解密以及 2 个参数:密码和一些数据。

但在许多情况下,我们无法控制执行两端操作的软件——为了适应不同的标准和协议,开发人员必须与之交互的 API 变得更加复杂。

还有关于如何表示数据以进行存储和传输的问题。