回顾:使用身份验证加密/解密大文件的协议

时间:2014-11-24 16:58:36

标签: security encryption cryptography aes

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

我一直在试验几种AES模式(特别是CBC和GCM),并且每种方法都有一些优点和缺点。

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

所以我写这篇文章来讨论我将要实施的协议来完成任务。请根据需要提供反馈。

加密

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

解密

  • 将使用自定义CipherInputStream。此流知道如何读取标题。
  • 然后它将读取认证标签,并将消化整个文件(不加密)以验证它没有被篡改(我实际上并没有测量它将如何执行,但它是只有这样我才能安全地开始解密而不会知道太晚的风险,不应该首先解密文件。)
  • 如果标签验证正常,则标头将提供初始化密码所需的所有信息,并使输入流解密文件。否则会失败。

为了处理大文件的加密/解密,这对您来说是否合适?

1 个答案:

答案 0 :(得分:1)

有些观点:

A)散列加密数据,散列本身未加密。

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

使用密钥的“好”用户仍然可以毫无问题地解密它,但它不会是原始明文。到目前为止,没有任何问题,如果它是垃圾数据,如果(并且只有)你肯定知道内部,即。如何识别它是否不变。但是你知道吗?并且“gargabe”数据实际上有意义的可能性很小,但不管怎么说都不是真正的数据。

因此,要识别文件是否已更改,请添加加密数据的SHA哈希值 如果恶意用户M覆盖加密文件部分,他将使用哈希做什么?是的,他可以重新计算它以匹配新的加密数据。再一次,你无法识别变化 如果明文被散列,然后一切都被加密,那么几乎不可能做到正确。记住,M不知道钥匙或任何东西。 M可以将内部的明文更改为“某事”,但是无法将哈希值更改为正确的值。

B)CBC

如果您每次解密整个文件或没有任何内容,CBC就可以了 如果要访问部分内容而不解密未使用的部分,请查看 XTS

C)处理两次

  

然后它将读取身份验证标记,并将消化整个   文件(没有加密)来验证它没有被篡改(我   实际上没有衡量这将如何表现,但它是唯一的   方式我可以想到安全地开始解密而没有风险   知道太晚,文件不应该在第一个解密   位)。

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

我不知道有关Java CipherOutputStream的详细信息,
但除了那个和上面提到的观点之外,它看起来还不错。