加密文件存储。如何简化密码管理方案?

信息安全 密码 密码学
2021-08-29 13:36:10

它可能是重复的,但我无法找出正确的搜索关键字。你可以通过告诉我这些话来提供帮助,我很擅长谷歌:)

我想开发类似于对每个文件进行加密的文件存储。只有一个用户,所有数据(和代码)都存储在他的本地机器上。用户可以导入一些文件并读取以前导入的文件。

要求

主要攻击媒介是未经授权的数据读取无需防止非法导入文件。

另外,我想实现plausible deniability它看起来像这样:实际上有两个存储,其中一个使用空密码加密,并且可以将其内容暴露给任何人。它用于掩盖隐藏某些东西的事实。只是一个额外的盾牌。

整个系统安全性的关键是用户的密码只存储在他的脑海中,即无法通过编程方式访问(除非有键盘记录器、心灵感应软件或带有高分辨率摄像头的卫星可以看到你在打字)。

执行

现在我已经结束了以下方案。

  1. 用户密码是用于加密/解密随机生成的 2 级密码的密钥。使用对称密码(例如,目前被认为是安全的 AES)。

  2. 2 级加密是非对称的。从外部源导入未加密文件时使用加密(公共)密钥。解密(私有)密钥用于读取文件。由于非对称算法很慢,这些密钥实际上用于保护会话密钥(每个文件唯一)。仅当加密会话密钥时,私钥在内存中以纯文本形式可用。

  3. 第 3 级使用对称加密、再次使用 AES 或一些安全流密码(仅在性能好得多的情况下,因为安全是首选)。它用于实际加密/解密文件内容。

你终于读到了最后 :) 以下是问题:

  1. 如何在不损害安全性的情况下简化该方案?

    简而言之:去掉中间层。尽管如此,仍然必须使用两个级别,以防止密码疲劳/熵耗尽并满足我的偏执狂:)

  2. 如何增强它的安全性?我知道这里有错误,加密是一件棘手的事情。

    非常感谢@DeerHunter 指出潜在的缺陷。

  3. 谷歌和阅读什么?请不要像Shneier这样的基本东西:)

    好吧,我有足够的术语和概念来深入研究。至少目前是这样。

  4. 我仍然不确定是否应该使用非对称密码(在第一级)。我认为这将有助于分散风险:解密(私钥)密钥仅以明文形式生成,而加密(公钥)密钥甚至可以暴露给所有人。但是与对称密码相比,我仍然有一个密钥可以在 RAM 中保护,并且还有额外的(公共)密钥需要担心。

编辑1不想设计自己的标准,这远远超出了我的知识范围。我会尽可能使用被证明是安全的东西。例如。我自己要做的就是将 Crypto++ 的几个类组合在一起工作。我只需要正确的设计来做到这一点。目前我认为全盘加密不适合我的情况。我考虑过 TrueCrypt 等,但它不允许隐藏加密数据的存在我更喜欢按文件加密的解决方案(加密标准或协议)。

编辑2重新排列文本以拆分要求和实施,添加可否认的合理性要求。

EDIT3还有一个关于非对称加密的问题。

3个回答

使此类事情安全的第一个也是可能唯一的方法不是自己动手正确实施加密协议而不到处泄漏信息是困难的;设计加密协议更难。

由于用户自己导入文件并阅读它,因此无需调用非对称加密。非对称密码学适用于(至少)两个具有不同权利的参与者(例如签名者和验证者;或发送者和接收者);在这里,有用户和他自己:同一个人,因此不需要不对称。另一种看待这一点的方式是,非对称密码学旨在解决几个人之间共享秘密信息的问题。用户与自己共享秘密信息没有问题。

因此,基本结构是使用从适合用户大脑的秘密(密码)派生的密钥来加密文件。这指向了许多操作系统都存在的全盘加密工具。一些最新的 Windows 版本带有BitLocker好的 Linux 发行版有自己的系统。一个经常被推荐的用于全盘加密的第三方产品是TrueCrypt使用其中之一,你会活得更久,更快乐。

我什至没有读完你的 OP 来确定这个方案太复杂了。

将用户密码输入密钥派生函数;给定适当的散列轮数,PBKDF2 就可以了。生成的值现在是所有数据的对称加密密钥,使用 AES 或您选择的任何现成加密算法。一旦加密,每个文件放在哪里都没有关系;没有人可以在不知道用户密码(这是一个真正的秘密)以及 PBKDF2 功能(不是)和密码模式(同上)的特定设置的情况下阅读纯文本内容。

如果您希望用户能够更改密码,而不必解密和重新加密整个数据存储,那么您需要一个中间件。为每个受保护的文件生成一个随机密钥和 IV。将文件名、密钥和 IV 存储为主密钥文件的一行,其内容使用用户密码和常量 IV 加密。每当用户更改密码时,使用用户基于密码的旧密钥和当前 IV 解密密钥文件,然后从新密码派生新密钥,生成新的随机 IV,并重新加密密钥文件。

如果您希望用户在忘记密码时能够恢复他们的数据,那么必须发生以下两件事之一;必须使用主机系统已知的密钥对主密钥文件的副本进行加密,否则必须以类似方式加密用户的密码或派生密钥。这可以通过公钥来完成,允许用户的客户端软件安全地处理这个额外的步骤。在需要恢复的情况下,可以应用私钥来解密主密钥文件(直接或间接取决于确切的方法),然后可以使用用户提供的替换密码重新加密。

需要考虑的一些额外事项:

  • 任何时候都不应将用户的纯文本密码或任何文件的未加密版本,尤其是主密钥文件,保存到硬盘上。如果它曾经被写入磁盘,那么攻击者可以转储磁盘,检查其内容并发现用户的秘密。
    • 这要求您对操作系统有足够的控制权,以确保这些数据永远不会从 RAM 换出到虚拟内存页面文件(或者在不再需要时立即将其删除)。
    • 这通常还要求在主动获取密码密钥或加密/解密受保护文件时,此类机密在 RAM 中的停留时间不得超过短暂时间。一旦不再需要纯文本,就销毁它。
  • 您的程序将加密和解密大量数据。随着时间的推移,这可能会使该方案容易受到密码疲劳的影响,在足够多的数据被加密后,密码秘密中固有的熵将被耗尽,并且密码的状态将是可重复的。
    • 通常,这对于任何一个文件,甚至是大型数据存储都不是问题,但是如果您永远使用一个密钥来处理所有事情,则可能会出现问题
    • 所以,不要。每次您的用户更新加密文件时,为该文件生成一个新密钥和 IV,并使用新信息更新主密钥文件。因为这需要对主密钥文件进行解密和重新加密,所以为重新加密步骤生成一个新的随机 IV 也是一个不错的主意(当然密钥是相对静态的,但这些操作也是通过以下方式增加 KDF 强度的好机会增加散列轮数)。

我认为您正在谈论一些混淆的安全措施。

1) 权限 - 无论文件位于何处(无论是否隐藏),您都需要确保无法访问该文件夹。使用windows/Linux内置的权限系统,根据用户分配读/写/执行权限。如果有人给你植入了病毒或入侵了你的电脑并获得了 root/Sys 用户权限..那么你就有麻烦了。

2) 密码/密码密钥保护 - AES 128 位是一种强大的算法,应该用于加密文件的内容。但是请记住,加密的密钥在系统内部。如果密钥被劫持,文件可以被解密。在对称加密中,密钥实际上是用来加密和解密数据的,记住!所以你的工作是保护密钥。

3) 加密强度- 加密强度有几个因素,你需要使用不可预测的加密,并使用扩散、混淆、雪崩效应、初始化向量 (IV) 和强大的密钥流生成器等良好的元素来创建良好的强密钥流。

4) 用户密码管理- 用户密码必须是强密码,由字母数字和非字母数字字符组成。此外,密码输入面板不应该容易暴力破解,每次尝试错误时使用验证码或减慢时间,这样可以防止暴力破解。