You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C#使用ProtoBuf-Net库序列化类数据时如何加密保存为不可读文件

解决方案

Protobuf本身不会对内容做加密处理,字符串类型字段会直接存储原始明文,因此用文本编辑器可以直接读取到对应字段值。你只需在序列化输出和文件存储之间增加一层对称加密逻辑即可,这里采用性能和安全性平衡的AES加密方案,改动如下:

改动说明

  1. 新增System.Security.Cryptography命名空间引用,用于加密逻辑实现
  2. 定义AES所需的密钥和IV,生产环境请从安全配置模块读取,禁止硬编码在代码中
  3. 序列化流程改为:Protobuf序列化内容先写入加密流,加密流再写入本地文件
  4. 配套提供解密反序列化逻辑,保证后续可以正常读取文件内容

完整实现代码

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 10:27:01