C#使用ProtoBuf-Net库序列化类数据时如何加密保存为不可读文件
解决方案
Protobuf本身不会对内容做加密处理,字符串类型字段会直接存储原始明文,因此用文本编辑器可以直接读取到对应字段值。你只需在序列化输出和文件存储之间增加一层对称加密逻辑即可,这里采用性能和安全性平衡的AES加密方案,改动如下:
改动说明
- 新增
System.Security.Cryptography命名空间引用,用于加密逻辑实现 - 定义AES所需的密钥和IV,生产环境请从安全配置模块读取,禁止硬编码在代码中
- 序列化流程改为:Protobuf序列化内容先写入加密流,加密流再写入本地文件
- 配套提供解密反序列化逻辑,保证后续可以正常读取文件内容
完整实现代码
using ProtoBuf; using System.IO; using System.Security.Cryptography; namespace TestProtoBufNet { class Program { // AES密钥 32字节对应AES-256,自行替换为你自己的密钥 private static readonly byte[] AesKey = new byte[32] { 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F, 0x20 }; // AES IV固定16字节,自行替换为你自己的IV private static readonly byte[] AesIv = new byte[16] { 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0x10 }; static void Main(string[] args) { var person = new Person { Id = 12345, Name = "Fred", Address = new Address { Line1 = "Flat 1", Line2 = "The Meadows" } }; // 加密序列化保存 using (var fileStream = File.Create("C:\\Temp\\person.bin")) using (var aes = Aes.Create()) using (var encryptor = aes.CreateEncryptor(AesKey, AesIv)) using (var cryptoStream = new CryptoStream(fileStream, encryptor, CryptoStreamMode.Write)) { Serializer.Serialize(cryptoStream, person); } // 示例:解密反序列化读取 Person readPerson; using (var fileStream = File.OpenRead("C:\\Temp\\person.bin")) using (var aes = Aes.Create()) using (var decryptor = aes.CreateDecryptor(AesKey, AesIv)) using (var cryptoStream = new CryptoStream(fileStream, decryptor, CryptoStreamMode.Read)) { readPerson = Serializer.Deserialize<Person>(cryptoStream); } } [ProtoContract] class Person { [ProtoMember(1)] public int Id { get; set; } [ProtoMember(2)] public string Name { get; set; } [ProtoMember(3)] public Address Address { get; set; } } [ProtoContract] class Address { [ProtoMember(1)] public string Line1 { get; set; } [ProtoMember(2)] public string Line2 { get; set; } } } }
注意事项
- 密钥和IV必须妥善保管,丢失后加密的文件将无法解密恢复
- 如果对安全等级要求更高,可以采用「非对称加密加密AES密钥 + 对称加密加密实际数据」的组合方案
- 加密后的文件不存在明文字段,普通文本编辑器无法直接读取有效内容
内容的提问来源于stack exchange,提问作者Fabiano Augusto
相关产品推荐
相关产品推荐

