在VB.NET中保护数据?

Vol*_*ort 2 vb.net encryption

我的VB.NET应用程序有一个非常重要的布尔变量.我需要能够将它保存在"某处"并在将来读取它(即使应用程序已关闭).

目前,我将变量存储为.bin文件.但我担心用户可以简单地抓取文件并做一些魔术来编辑值.

我需要从用户眼中完全看不到这个值.或者至少,让它无法编辑.隐藏这种价值的最佳方法是什么?

我设法将变量存储在我的在线MySQL数据库中.但说实话,这对我的目的来说效果不佳.我需要在本地存储...

有任何想法吗?

Mat*_*zen 6

从理论上讲,你永远不能隐藏这个变量.但是,您可以更难找到或阅读.要知道如何隐藏变量,您必须首先了解一些常见的检索方法.

典型问题和解决方案

其他人如何理论上可以检索你的变量值

  1. 使用.NET Reflector或任何其他.NET反编译程序单击即可反编译程序.
  2. 在程序运行时分析PC的内存,并从那里检索值.
  3. 如果您的值保存在文件中,则用户可以通过挂钩或转储比较分析硬盘IO活动,轻松找到它.
  4. 如果您的值保存在注册表中,则简单的注册表挂钩或注册表转储比较工具可以确定值的存储位置.
  5. 如果您的值是加密的,则可以使用方法#1(反编译程序)来确定如何进行解密.

解决上面可能出现的问题

  1. 可以使用一般的混淆程序来使应用程序更难反编译.为此,我建议使用SmartAssembly.除此之外,还有一个名为Spoon Studio(以前称为PostBuild)的工具,它将您的应用程序重新编译为汇编代码(并使其在未安装.NET Framework的情况下运行).
  2. SecureString的类可以用来使其更难找到和解密的价值,同时它在内存中.此类在使用后也会自行清理,但使用时通常比普通字符串稍慢.
  3. 将事物存储在文件中并不是一个坏主意(即使人们可以嗅探文件活动),因为您始终可以以非常漂亮的方式存储变量.例如,你可以有一个名为IsFullScreen.bin的文件,它包含你的布尔变量的值(1或0,或者是真或假),即使它与全屏渲染无关.这会让它有点混乱,但也不是很漂亮的编程方式.
  4. 对于注册表,解决方案#3中的所有内容仍然适用.
  5. 加密也不是一个坏主意,并且很难解密某些加密类型(例如,如果您有服务器,则为公钥/私钥加密)或散列(例如MD5或SHA1).
  6. 在您的方案中,您可以将值存储在服务器上吗?

总结一下......

您无法完全保护您的应用程序.但是你可以使用上面的一些解决方案(或将它们结合起来)以获得更好的保护,使其更难.

当然,过早的安全是不好的.如果那个布尔值不是很重要,那么在我看来,一些简单的加密也会很好.

还有更多 ...

编辑1

我刚刚注意到你已经评论了你自己的答案,说文件在复制到另一台计算机并从那里读取之后不应该是"有效的".

如果是这种情况,您可以使用一些基于密钥的加密,例如XOR加密,然后使用PC的MAC地址或主板序列号作为加密的密钥.

然后,在计算机上创建文件也需要读取文件.如果您对此感兴趣,请添加评论,我会给您一个代码示例.