我been trying到figure out完成将大(几GB)文件加密到文件系统以便以后访问的最佳方法。
我一直在试验几种AES模式(特别是CBC和GCM),并且每种方法都有一些优点和缺点。
经过研究和询问,我得出的结论是,至少在目前,使用AES + GCM对我来说是不可行的,主要是因为它issues has in Java以及我无法使用BouncyCastle 。
所以我写这篇文章来讨论我将要实施的协议来完成任务。请根据需要提供反馈。
为了处理大文件的加密/解密,这对您来说是否合适?
答案 0 :(得分:1)
有些观点:
A)散列加密数据,散列本身未加密。
恶意人类M可以在没有任何哈希的情况下做的一件事:用其他东西覆盖加密文件。在此操作之后,M不知道密钥,明文之前和/或明文,但是他可以将明文改为不同的东西(通常,它变成垃圾数据)。对某些人来说,销毁也是一个有效的目的。
使用密钥的“好”用户仍然可以毫无问题地解密它,但它不会是原始明文。到目前为止,没有任何问题,如果它是垃圾数据,如果(并且只有)你肯定知道内部,即。如何识别它是否不变。但是你知道吗?并且“gargabe”数据实际上有意义的可能性很小,但不管怎么说都不是真正的数据。
因此,要识别文件是否已更改,请添加加密数据的SHA哈希值 如果恶意用户M覆盖加密文件部分,他将使用哈希做什么?是的,他可以重新计算它以匹配新的加密数据。再一次,你无法识别变化 如果明文被散列,然后一切都被加密,那么几乎不可能做到正确。记住,M不知道钥匙或任何东西。 M可以将内部的明文更改为“某事”,但是无法将哈希值更改为正确的值。
B)CBC
如果您每次解密整个文件或没有任何内容,CBC就可以了 如果要访问部分内容而不解密未使用的部分,请查看 XTS 。
C)处理两次
然后它将读取身份验证标记,并将消化整个 文件(没有加密)来验证它没有被篡改(我 实际上没有衡量这将如何表现,但它是唯一的 方式我可以想到安全地开始解密而没有风险 知道太晚,文件不应该在第一个解密 位)。
根据文件的使用方式,这确实是必要的。特别是如果您想在最后一步中使用数据,那么在它完成之前。
我不知道有关Java CipherOutputStream的详细信息,
但除了那个和上面提到的观点之外,它看起来还不错。