在VB.NET中保护数据?

时间:2011-12-30 18:07:27

标签: vb.net encryption

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

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

我需要让用户的眼睛完全无法使用此值。 或者至少,无法编辑。隐藏这种价值的最佳方法是什么?

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

有什么想法吗?

3 个答案:

答案 0 :(得分:6)

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

典型问题和解决方案

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

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

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

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

      当然,过早的安全是不好的。如果那个布尔值不是很重要,那么我认为一些简单的加密也可以。

      还有更多......

      修改1

      我刚刚注意到您已经对自己的答案发表了评论,称该文件在将文件复制到另一台计算机并从那里读取后不应该是“有效”。

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

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

答案 1 :(得分:2)

我会以非显而易见的方式将其存储在注册表中。例如,使注册表项的名称显得重要并存储随机数值,然后确保它以0或1结尾或包含嵌入数字中固定位置的0或1。

然后,您可以从注册表中读取值,并从适当的位置提取0或1。

答案 2 :(得分:1)

在存储之前加密值。使用.NET Cryptography Model。有关如何使用该模型实现某些内容的更多信息see