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

.NET7离线桌面程序如何将数据内置存储以防止篡改?

解决方案

一、将数据嵌入程序内部的实现方式

如果要把卡片ID数据打包进程序,可按以下步骤操作:

  • 嵌入加密的资源文件
    1. 把卡片ID的哈希值集合(禁止存明文)保存为文本文件,再用AES算法对文件内容加密。
    2. 在.NET项目中添加该加密文件,右键设置文件属性为嵌入的资源。
    3. 程序运行时,通过以下代码读取嵌入资源:
      var assembly = System.Reflection.Assembly.GetExecutingAssembly();
      var resourceName = "YourNamespace.YourEncryptedFile.txt";
      using (var stream = assembly.GetManifestResourceStream(resourceName))
      {
          // 读取流内容,用AES解密后得到哈希集合
      }
      
  • 增强反编译防护
    • 对程序集使用混淆工具(如ConfuserEx),同时把AES密钥拆分为多个片段硬编码在代码的不同位置,运行时再拼接还原,避免密钥被直接反编译获取。
    • 验证卡片时,计算读取到的卡片ID的SHA256哈希,再和嵌入资源中的哈希值比对,不直接存储明文ID。

二、更优的替代方案

嵌入数据的缺点是更新卡片数据时必须重新分发程序,以下方案兼顾安全性和可维护性:

1. 加密存储+完整性校验

  • 用AES加密卡片ID数据,存储为本地文件(比如SQLite加密数据库或自定义格式文件)。
  • 额外生成一个校验文件,存储数据文件的SHA256哈希值(加盐后再次哈希)。程序启动时先验证数据文件的哈希是否和校验文件一致,若不一致则拒绝执行验证逻辑并告警。
  • 密钥可以结合程序集的特征(如程序集哈希)生成,或者拆分密钥为两部分:一部分嵌在程序中,另一部分存在隐藏的系统级小文件中,双重降低密钥泄露风险。

2. 硬件加密狗存储

如果工厂有预算,使用USB加密狗存储加密后的卡片ID数据是最可靠的方案:

  • 加密狗自带防复制、防篡改机制,数据无法被导出或修改。
  • 通过加密狗厂商提供的.NET SDK读取数据,离线环境下完全可用,且无需担心数据被替换删除。

3. 强命名程序集+签名

给你的.NET7程序集添加强命名签名:

  • 在项目属性中启用强命名,生成专属密钥文件,编译时对程序集签名。
  • 签名后的程序集无法被篡改后重新运行(除非获取你的私钥),结合上述任一存储方案,可进一步防止程序本身被替换。

内容的提问来源于stack exchange,提问作者Melon NG

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 14:45:25