Unity C#中BinaryFormatter序列化UUID仍明文可见?未达预期
BinaryFormatter存储UUID明文可见问题解答
核心判定
- 不存在代码实现错误的问题,本质是对BinaryFormatter的功能定位存在理解偏差
- BinaryFormatter仅承担托管对象的序列化/反序列化能力,本身不提供任何内容加密、混淆的内置功能
- 混淆、加密内容属于独立的安全能力,序列化工具本身不会默认叠加这类处理逻辑
明文可见的原因
- 你打开的存储文件中,开头的
ÿÿÿÿ、零散的$属于BinaryFormatter自动写入的元数据头,作用是标记序列化对象的类型、结构、版本信息,方便后续反序列化时正确还原对象 - 存储的UUID是普通字符串类型,序列化时仅会在内容前后追加上述元数据,字符串本身的字节内容会几乎原样写入文件,没有做任何转码、加密处理,因此用普通记事本、十六进制编辑器就能直接读取到完整UUID,和直接用普通文本写入文件的可读性区别不大
实现“普通人无法直接识别UUID”的可行方案
- 优先替换序列化方案:BinaryFormatter本身存在已知的反序列化安全漏洞,官方已明确不推荐在新项目中使用,可替换为JSON、Protobuf等轻量序列化格式
- 低门槛混淆方案:将UUID字符串转为字节数组后,使用固定密钥做异或运算,再将处理后的字节写入文件,打开时会显示为无意义乱码,普通用户无法直接识别内容
- 高安全性方案:对UUID内容做AES对称加密后再写入文件,只有持有正确密钥的程序才能解密还原原始UUID
现有代码的优化建议
- 代码中直接实例化的
FileStream没有做异常安全的资源释放,推荐使用using语句包裹文件操作,避免程序异常退出时文件被占用、数据损坏的问题
内容的提问来源于stack exchange,提问作者Louis D
相关产品推荐
相关产品推荐

