C# WFA项目如何加密或隐藏JSON文件数据,禁止用户读取复制
C# WinForm JSON数据保护实现方案
推荐实现路径(优先级从高到低)
- 方案1:加密后内嵌到程序集资源(最推荐,无额外文件)
你只有300KB的小体积数据,完全不需要单独放外置文件,直接把加密后的JSON字节流嵌入到程序的资源文件中即可,用户根本找不到单独的相关文件,安全门槛更高。
操作步骤:- 提前用AES对称加密算法把原JSON文件加密为二进制数据
- 右键项目→属性→资源→添加资源→添加现有文件,把加密后的二进制文件加进去,默认会生成强类型的资源属性,运行时直接读取即可
- 程序启动后读取资源里的二进制数据,解密后直接反序列化为C#对象使用,不需要落地到本地磁盘
注意:密钥不要明文硬编码在代码中,可以拆分为多段常量分散存储在不同类中,配合代码混淆工具(如免费的ConfuserEx)做字符串混淆,避免被直接反编译拿到密钥。
- 方案2:加密后作为外置文件存储,运行时解密读取
如果后续需要更新JSON数据不想重新编译程序,可以选这个方案。
操作要点:- 加密算法同样选AES即可,300KB数据解密耗时基本可以忽略
- 加密后的文件修改后缀名(比如改为
.dat/.bin),不要保留.json后缀,避免被用户直接识别 - 可以在校验文件哈希通过后再解密,避免用户篡改文件内容
简化代码示例
AES解密的核心代码参考:
public static string AesDecrypt(byte[] cipherData, byte[] key, byte[] iv) { using (Aes aes = Aes.Create()) { aes.Key = key; aes.IV = iv; ICryptoTransform decryptor = aes.CreateDecryptor(aes.Key, aes.IV); using (MemoryStream ms = new MemoryStream(cipherData)) using (CryptoStream cs = new CryptoStream(ms, decryptor, CryptoStreamMode.Read)) using (StreamReader sr = new StreamReader(cs)) { return sr.ReadToEnd(); } } }
解密得到JSON字符串后直接用Newtonsoft.Json或者System.Text.Json反序列化即可。
补充说明
所有本地运行的程序都不存在绝对的防破解方案,上述方法可以挡住99%以上的普通用户,避免JSON内容被直接读取复制,对于常规场景完全够用。如果需要更高的安全等级,可以考虑把核心数据放到服务端通过接口请求,但会增加开发和运维成本,对于纯客户端工具来说没有必要。
内容的提问来源于stack exchange,提问作者MickSmitte
相关产品推荐
相关产品推荐

