【发布时间】: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