【问题标题】:Review: Protocol for encryption/decryption of big files with authentication评论:带有身份验证的大文件加密/解密协议
【发布时间】:2015-01-22 11:19:21
【问题描述】:

我有 been tryingfigure out 完成将大(几 GB)文件加密到文件系​​统以供以后访问的任务的最佳方法。

我一直在试验几种 AES 模式(尤其是 CBC 和 GCM),我发现每种方法都有一些优点和缺点。

经过研究和询问,我得出的结论是,至少目前,使用 AES+GCM 对我来说是不可行的,主要是因为 issueshas in Java 以及我 不能使用 BouncyCastle

所以我写这篇文章是为了讨论我将要实施以完成任务的协议。请提供您认为合适的反馈。

加密

  • 使用 AES/CBC/PKCS5Padding 和 256 位密钥
  • 文件将使用自定义 CipherOutputStream 进行加密。此输出流将负责在文件开头写入自定义标头,该标头至少包含以下内容:
    • 前几个字节可以轻松判断文件已加密
    • 使用的算法、模式和填充
    • 密钥的大小
    • 标头本身的长度
  • 在文件被加密的同时,它也会被消化以计算其身份验证标签。
  • 当加密结束时,标签将附加在文件的末尾。该标签的大小是已知的,因此以后可以很容易地恢复它。

解密

  • 将使用自定义 CipherInputStream。此流知道如何读取标头。
  • 然后它将读取身份验证标签,并消化整个文件(不加密)以验证它没有被篡改(我还没有实际测量它的执行情况,但这是我能想到的唯一方法安全地开始解密,而不会有知道文件一开始就不应该被解密的风险)。
  • 如果标签验证成功,那么标头将提供初始化密码和使输入流解密文件所需的所有信息。否则会失败。

这对您来说似乎可以处理大文件的加密/解密吗?

【问题讨论】:

  • 好的,抱歉,忘记之前的评论了。直到现在才阅读链接。问题 1:SHA-hash 是在加密层内(即明文的 SHA,然后加密哈希)还是在外面?应该在里面。问题2:为什么是CBC? (不是“为什么不是 GCM”,而是为什么要对所有其他可能的事情进行 CBC?)
  • 问题1:根据我的阅读,序列应该是加密然后mac,所以这就是我打算做的。 问题 2: 嗯,CBC 是我第一次尝试,而且我已经完成了整个加密,所以我想到了使用它。它有什么问题,您认为什么是更好的选择?
  • 有点长,在下面补充。

标签: security encryption cryptography aes


【解决方案1】:

几点:

A) 加密数据的散列,散列本身没有加密。

恶意的人类 M 在没有任何哈希的情况下可能会做的事情之一:用其他东西覆盖加密文件。 M 不知道密钥、此操作之前的明文和/或此操作之后的明文,但他可以将明文更改为不同的内容(通常,它会变成垃圾数据)。破坏对某些人来说也是一个有效的目的。

拥有密钥的“好”用户仍然可以毫无问题地解密它,但它不会是原始明文。到目前为止,如果(且仅当)您确定内部是什么时,如果它是垃圾数据,则没有问题,即。如何识别它是否未更改。但是你知道吗? “垃圾”数据实际上是有意义的,但无论如何都不是真正的数据,这种可能性很小。

因此,要识别文件是否已更改,您需要添加加密数据的 SHA 哈希值。
如果邪恶的用户 M 覆盖了加密文件部分,他会如何处理哈希?对了,他可以重新计算,让它匹配新的加密数据。再一次,您无法识别更改。
如果对明文进行哈希处理,然后对所有内容进行加密,则几乎不可能正确处理。请记住,M 不知道密钥或任何东西。 M 可以将内部的明文更改为“某物”,但不能将散列更改为该某物的正确值。

B) CBC

如果您每次都解密整个文件或什么都不解密,CBC 就可以了。
如果您想在不解密未使用部分的情况下访问其中的一部分,请查看 XTS

C) 处理两次

然后它将读取身份验证标签,并消化整个 文件(不加密)以验证它没有被篡改(我 还没有真正衡量这将如何执行,但它是唯一的 我能想到的安全开始解密而没有风险的方法 知道太晚了文件不应该在第一次被解密 地点)。

根据文件的使用方式,这确实是必要的。特别是如果您想在最后一步中使用数据,在它完成之前。

我不知道有关 Java CipherOutputStream 的详细信息,
但除此之外还有提到的几点,我觉得还不错。

【讨论】:

  • A) 因此,如果我理解正确,您的意思是 MAC 应该发生在纯文本上,然后是纯文本 + mac 加密。你是这么说的吗?根据this 的说法,这绝对是一种可能的方法,但是,与 Encrypt 然后 MAC 相比,它不一定提供最好的一组功能。我是不是搞错了?
  • C) 文件将更有可能被流式传输,可以被读取、重放或其他取决于其原始格式。我对这种潜在双重处理的意图是不要开始解密任何可能需要存储在临时文件中的东西(例如,因为它们是大文件),以便以后发现文件在最后被篡改,在这种情况下,我已经向潜在对手提供过多信息
  • B) 然后是 CBC,因为我在访问文件时需要全部或全部内容
  • @alejo 答:请注意,该链接通常讨论 MAC。许多(或根据观点,“所有”)MAC 算法都依赖于密钥本身,因此攻击者无法在不知道的情况下重新生成它。 SHA 家族不需要密钥,每个人都可以使用它,并且每次结果都是一样的(对于某些给定的数据)。
  • 我使用的 MAC 依赖于生成的密钥,因此我认为对加密数据执行此操作是安全的。另外,如果我是通过纯文本进行的,为了对其进行身份验证,我首先需要解密,在这种情况下(由于文件大小),我认为我可能会成为侧通道攻击的目标
猜你喜欢
  • 2011-07-13
  • 1970-01-01
  • 2018-05-09
  • 1970-01-01
  • 2011-11-09
  • 1970-01-01
  • 1970-01-01
  • 2014-05-30
  • 2010-11-04
相关资源
最近更新 更多