【问题标题】:Serialize, Compress and Encrypt in C#C#中的序列化、压缩和加密
【发布时间】:2016-04-07 18:24:12
【问题描述】:

我想编写一个可以按顺序序列化、压缩和加密对象的 C# 类。我需要生成的文件来

  • 尽快创建
  • 尽可能少占用空间
  • 尽可能不可读

我已经研究和编码了一段时间,这就是我所拥有的。

    private void SaveObject(string path, object obj)
    {
        using (FileStream fileStream = new FileStream(path, FileMode.Create, FileAccess.Write, FileShare.None))
        {
            string password = "123";
            UnicodeEncoding UE = new UnicodeEncoding();
            byte[] key = UE.GetBytes(password);
            RijndaelManaged RMCrypto = new RijndaelManaged();
            using (CryptoStream cryptoStream = new CryptoStream(fileStream, RMCrypto.CreateEncryptor(key, key), CryptoStreamMode.Write))
            using (var gZipStream = new GZipStream(cryptoStream, CompressionMode.Compress))
            {
                BinaryFormatter binaryFormatter = new BinaryFormatter();
                binaryFormatter.Serialize(gZipStream, obj);
            }
        }
    }

    private void LoadObject(string path, out object obj)
    {
        using (FileStream fileStream = new FileStream(path, FileMode.Open))
        {
            string password = "123"; 
            UnicodeEncoding UE = new UnicodeEncoding();
            byte[] key = UE.GetBytes(password);
            RijndaelManaged RMCrypto = new RijndaelManaged();
            using (CryptoStream cryptoStream = new CryptoStream(fileStream, RMCrypto.CreateDecryptor(key, key), CryptoStreamMode.Read))
            using (var gZipStream = new GZipStream(cryptoStream, CompressionMode.Decompress))
            {
                BinaryFormatter binaryFormatter = new BinaryFormatter();
                obj = binaryFormatter.Deserialize(gZipStream);
            }
        }

    }

我是一名业余程序员,对序列化、流和加密知之甚少。我什至很惊讶这没有问题。我的问题是:此代码是否遵循最佳编程实践并在不浪费时间或资源的情况下充分实现目标?

注意:这是我将在我的程序中用于在本地存储数据的通用方法。

【问题讨论】:

  • 无法读取代码中的内联密码?如果您不想花时间阅读/理解通过加密解决的安全问题,您将仅通过压缩获得可比较的结果。
  • 正如我在问题中所说,我将使用它来存储本地文件。因此,我不知道我应该使用哪种加密。另外,我不需要将密码存储在某个地方吗?
  • 您使用哪种加密方式绝对没有关系。由于您不知道(或至少未在帖子中明确指定)您尝试通过加密解决什么问题,因此选择一个不会使您的代码/数据更加安全的问题。 IE。 能否阅读 Word 的 docx 文件并理解其内容(请注意,它是公开记录的文件格式,没有任何加密)?
  • 我明白了。然后假设我试图阻止其他人理解或修改文件。加密可以实现吗?如果不可以,它会在多大程度上有所帮助?
  • @TerryAnderson - “我不需要将密码存储在某个地方吗?” - 如果在您加密/解密文件时提供它,则不会。编译后的库可以被反编译,因此在源代码中有密码,与不加密文件相比,您基本上只需多加一个小角落即可。

标签: c# encryption serialization stream compression


【解决方案1】:

看看https://github.com/HansHinnekint/EncryptionLibhttps://github.com/HansHinnekint/EncryptionLib/blob/master/EncryptionLibrary/InfoBlockConvertor.cs的InfoBlockConvertor代码可以作为示例。

仅需要稍后添加压缩。应该没那么难。

【讨论】:

  • 请在答案中解释您的代码做了什么(或者更确切地说,为什么它解决了问题中的问题)。关于 SO 的答案必须是自包含的。
  • 嗯,我分享的代码回答了“我想编写一个可以按顺序序列化、压缩和加密对象的 C# 类”的请求。我需要生成的文件 - 尽可能快地创建 - 尽可能少地占用空间 - 尽可能不可读'我做了一些测试和压缩(使用 GZipStream)加密字符串(使用我的 AES 算法)使其更长,所以这没有任何意义。我选择了 AES(其中 RIjndael 加密是一个子集),因为它允许我在 .net 和更新的 UAP (WinRT) 应用程序之间共享代码。
猜你喜欢
  • 2012-01-24
  • 2017-05-17
  • 1970-01-01
  • 1970-01-01
  • 2013-04-06
  • 2013-07-08
  • 2010-09-09
  • 2014-06-07
  • 1970-01-01
相关资源
最近更新 更多