当前位置:首页 > C# > 正文

C#二进制序列化的加密处理(小白也能学会的C#数据安全实战教程)

在C#开发中,二进制序列化是一种将对象转换为字节流以便存储或传输的常用技术。然而,直接序列化敏感数据存在安全隐患。本文将手把手教你如何对C#二进制序列化的数据进行加密处理,保障你的应用数据安全

C#二进制序列化的加密处理(小白也能学会的C#数据安全实战教程) C#二进制序列化 序列化加密 C#数据安全 二进制序列化教程 第1张

什么是二进制序列化?

二进制序列化是将对象的状态(字段、属性等)转换成二进制格式的过程,便于保存到文件、数据库或通过网络传输。反序列化则是将二进制数据还原为原始对象。

但问题来了:如果序列化的是用户密码、身份证号等敏感信息,未加密的二进制文件一旦被窃取,后果不堪设想。因此,我们需要在序列化前后加入加密环节。

加密方案选择

在C#中,我们通常使用对称加密算法(如AES)来加密序列化后的数据。对称加密速度快、安全性高,非常适合本地数据保护。

完整代码示例

下面是一个完整的C#示例,展示如何对对象进行二进制序列化并使用AES加密,以及如何解密并反序列化。

using System;using System.IO;using System.Security.Cryptography;using System.Runtime.Serialization.Formatters.Binary;[Serializable]public class UserInfo{    public string Name { get; set; }    public string IdCard { get; set; }}public class SecureSerializer{    // 加密并序列化对象    public static void SerializeAndEncrypt(object obj, string filePath, byte[] key, byte[] iv)    {        // 1. 二进制序列化        BinaryFormatter formatter = new BinaryFormatter();        using (var ms = new MemoryStream())        {            formatter.Serialize(ms, obj);            byte[] serializedData = ms.ToArray();            // 2. AES加密            using (Aes aes = Aes.Create())            {                aes.Key = key;                aes.IV = iv;                ICryptoTransform encryptor = aes.CreateEncryptor(aes.Key, aes.IV);                using (var encryptedMs = new MemoryStream())                using (var cryptoStream = new CryptoStream(encryptedMs, encryptor, CryptoStreamMode.Write))                {                    cryptoStream.Write(serializedData, 0, serializedData.Length);                    cryptoStream.FlushFinalBlock();                    File.WriteAllBytes(filePath, encryptedMs.ToArray());                }            }        }    }    // 解密并反序列化对象    public static T DecryptAndDeserialize<T>(string filePath, byte[] key, byte[] iv)    {        byte[] encryptedData = File.ReadAllBytes(filePath);        // 1. AES解密        using (Aes aes = Aes.Create())        {            aes.Key = key;            aes.IV = iv;            ICryptoTransform decryptor = aes.CreateDecryptor(aes.Key, aes.IV);            using (var ms = new MemoryStream(encryptedData))            using (var cryptoStream = new CryptoStream(ms, decryptor, CryptoStreamMode.Read))            using (var resultMs = new MemoryStream())            {                cryptoStream.CopyTo(resultMs);                byte[] decryptedData = resultMs.ToArray();                // 2. 反序列化                BinaryFormatter formatter = new BinaryFormatter();                using (var dataMs = new MemoryStream(decryptedData))                {                    return (T)formatter.Deserialize(dataMs);                }            }        }    }}// 使用示例class Program{    static void Main()    {        // 生成密钥和IV(实际项目中应安全存储)        using (Aes aes = Aes.Create())        {            aes.GenerateKey();            aes.GenerateIV();            byte[] key = aes.Key;            byte[] iv = aes.IV;            var user = new UserInfo { Name = "张三", IdCard = "11010119900307XXXX" };            // 序列化并加密            SecureSerializer.SerializeAndEncrypt(user, "user.dat", key, iv);            // 解密并反序列化            var restoredUser = SecureSerializer.DecryptAndDeserialize<UserInfo>("user.dat", key, iv);            Console.WriteLine($"Name: {restoredUser.Name}, ID: {restoredUser.IdCard}");        }    }}

关键注意事项

  • 密钥管理:不要硬编码密钥!应使用安全的密钥管理系统(如Azure Key Vault)或从用户输入派生密钥。
  • BinaryFormatter 安全警告:Microsoft 已不推荐使用 BinaryFormatter,因其存在反序列化漏洞。在生产环境中建议改用 System.Text.JsonMessagePack 等更安全的序列化方式,并配合加密。
  • IV(初始化向量):每次加密应使用不同的IV,并与密文一起存储(通常放在文件开头),但IV无需保密。

总结

通过本文,你已经学会了如何在C#中对二进制序列化的数据进行加密处理,有效提升应用的数据安全水平。记住,安全无小事,即使是本地存储的数据也应加密保护。

如果你正在学习C#二进制序列化或构建需要数据持久化的应用,这套加密方案将为你打下坚实的安全基础。

关键词:C#二进制序列化、序列化加密、C#数据安全、二进制序列化教程