使用VC ++在Windows上保护虚拟磁盘

我有一个我想要使用的软件的DLL。 在DLL API中有一个函数“LoadConfigFile(char * file)”,它需要一个带有aboslutepath的文件名(例如“C:\ TestFolder \ ConfigFile.cfg”)。 该函数然后加载configuration文件本身。

由于安全的原因,我想只允许使用DLL的程序访问文件(内容)。

所以我想知道如何做到这一点,并search互联网的解决scheme。 在寻找解决scheme时,想到以下选项和问题:

我的开发环境是VC ++ 2010,操作系统是Windows XP。

我希望有人能帮助我解决这个问题。

太复杂了。 最简单的解决方案(因为你是在控制过程中)是:

  1. 创建一个临时文件,并专门打开它(甚至不共享读取)。 传递FILE_ATTRIBUTE_TEMPORARYFILE_FLAG_DELETE_ON_CLOSE因为它不是永久的
  2. 解密配置文件到这个临时文件。 保持手柄打开。
  3. 将临时文件名传递给DLL。 这是在你的过程中,所以它不受排他锁的影响。
  4. 当DLL完成时,将临时文件清零。
  5. 关闭你的手柄。 这将删除该文件。

由于临时文件在包含机密内容时被锁定,因此其他进程无法访问它。 而且由于它被标记为临时的,所以在关闭时删除,Windows不会将其冲刷到物理磁盘上。

当然,这不是完美的安全。 任何人都可以读取你的进程内存(我有SeDebugPrivilege )可以访问这些信息,但这是显而易见的。 只要在LoadConfigFile上放置一个调试断点LoadConfigFile

你的数据有多敏感? 你的应用程序的目标是什么?

在很多情况下,简单的自制加密机制可能足以吓跑不经意的读者。

如果您的数据需要彻底加密,请查看Windows加密函数(例如CryptProtectData,请参阅http://msdn.microsoft.com/en-us/library/aa380261(VS.85).aspx )。

在某些情况下,你不想加密你的数据,但你只是想确保没有人改变它。 在这种情况下,将哈希值(SHA-2,请参阅http://en.wikipedia.org/wiki/SHA-2)添加到您的文件中。

我能想到的唯一的事情就是散列和解密 。

用任何东西加密你的文件,使用从你的代码散列派生的密钥。 不要把钥匙存放在任何地方。 你的代码是关键。 更好的是,哈希一些内存结构,只有你的程序可以成功运行。

但是,每次更新代码时都有可能会中断。 你将不得不考虑32位和64位体系结构。 也许指针可能会发挥作用。 确保您的安全要求是值得的,不要低估维护工作。

通常,CryptProtectData会做,并提供pOptionalEntropy参数以增加安全性(然后接受@Patrick答案,而不是我的)。