【问题标题】:best practices to compress/encrypt压缩/加密的最佳实践
【发布时间】:2013-12-10 09:40:44
【问题描述】:

我的问题与如何在 3D 地形上存储大量信息有关。这些信息应该是秘密的,因为它们非常庞大,也应该被压缩。 我选择了文件存储,现在我想知道将对象数据加密/压缩(或压缩/加密)到文件的最佳实践。

我什至不知道写入文件然后压缩和加密是否更好,或者是否处理数据流然后写入文件。

任何建议将不胜感激!

【问题讨论】:

    标签: c# encryption compression


    【解决方案1】:

    我什至不知道写入文件然后压缩和加密是否更好,或者是否处理数据流然后写入文件。

    “更好”是无法衡量的。内存中的压缩和加密可能比直接写入文件更快,但如果数据大于内存中的容量,则很容易证明很麻烦。

    由于您确实希望将最终结果存储在磁盘上,我会这样处理(先压缩,然后加密,然后写入磁盘):

    using (var compressionStream = new CompressionStream(rawData))
    {
        using (var encryptionStream = new EncryptionStream(compressionStream))
        {
            using (var fileStream = new FileStream("outputfile"))
            {
                encryptionStream.CopyTo(fileStream);
            }
        }
    }
    

    CompressionStreamEncryptionStream 的实现当然取决于您使用的 API。

    【讨论】:

    • 只是想补充一点,你不能(实际上)压缩已经加密的文件。因为加密后的内容必须是伪随机的(否则加密真的很差)。而且你不能压缩随机序列,因为没有重复也没有模式——这就是加密的全部意义所在。所以如果你想压缩你的数据,一定要先压缩再加密。
    • 感谢您的解释。如果我想被引导到一个特定的 API,考虑到我的首要任务是安全性然后最小化数据大小,你有什么建议?
    • 如果您的首要任务是安全,请使用加密 API。当它最小化数据大小时,使用压缩 API。具体实现很大程度上取决于您的预期用途和数据特征,但您可以随时查看 .NET 的 GzipStreamCryptoStream 类。
    • 太棒了!所以一个好的方法可能是写一些适配器GzipStreamCryptoStream例如?
    • @Leggy 没关系。有关一些示例,请参阅这些类的 MSDN 页面;将它们组合起来相当容易。
    【解决方案2】:

    压缩和加密是有趣的野兽 - 加密的行为会使位随机化,从而使 GZip 压缩更加困难。

    请参阅此文件中的注释。 https://serverfault.com/questions/17855/can-i-compress-an-encrypted-file

    按照 CodeCaster 所说的顺序操作将生成最小的文件,因为该文件在加密之前已经被压缩。

    还要考虑文件大小和存储文件的磁盘类型,以及解密和解压缩的机器类型。如果您将其流式传输回内存,您可能会发现在某些情况下内存不足,除非您将流式传输到缓冲区或将文件分解。

    【讨论】:

    • 这听起来很有趣,只要我能深入理解你最后一句话的意思。用于压缩/解压缩的机器的相关性是什么?
    • 如果您的机器的可用 RAM 与对象的大小相比较少,那么您最终会遇到 OutOfMemoryException 的风险。
    • 如果可能,您还应该考虑用于存储数据的磁盘的配置文件。如果您了解媒体,则可以进行优化 - 如果您不受 IO 限制(例如,如果您有 SSD 或某个 RAID 阵列),您可以选择并行处理较小数据流,或者您可以选择不同的策略(大的连续片段)如果您的系统更喜欢序列化和加密。这里有一些试验和错误。当然,如果你不控制磁盘,那么你可能需要泛化。我不会让文件太大——它通常更容易管理。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-09-18
    • 1970-01-01
    • 2010-10-15
    • 2010-10-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多