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

时间:2012-03-26 12:24:21

标签: c++ windows security file-access

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

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

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

  • 我可以加密文件。 - >有人知道这个免费图书馆吗? - >那么可以将函数作为astring函数给出,函数可以读取文件吗?

  • 也许有可能使用虚拟文件系统。我的意思是从加密的源加载文件,解密它并将其保存在虚拟磁盘或文件夹的RAM中。然后将链接作为字符串提供给DLL函数 - >这可能吗? - >有人知道有免费图书馆吗?

  • 我还读到了一些关于“在内存数据库中”的内容。 - >这可以解决我的问题吗?

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

我希望有人可以帮我解决这个问题。

3 个答案:

答案 0 :(得分:1)

您的数据有多敏感?您的申请目标是什么?

在许多情况下,简单的家庭加密机制可能足以吓跑随意的读者。

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

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

答案 1 :(得分:1)

我能想到的唯一一件事 - 我手边没有源代码 - 是hash and decrypt

使用从代码哈希派生的密钥对任何内容进行加密。不要将钥匙存放在任何地方。你的代码是关键。更好的是,哈希一些只有你的程序成功运行才能创建的内存结构。

但是每次更新代码时它都会破坏。您将不得不考虑32位和64位架构。指针alingment可能会发挥作用。确保您的安全要求值得付出努力,并且不要低估维护工作量。

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

答案 2 :(得分:1)

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

  1. 创建一个临时文件,并以独占方式打开它(甚至不共享读取)。通过FILE_ATTRIBUTE_TEMPORARYFILE_FLAG_DELETE_ON_CLOSE,因为它不是永久性的
  2. 解密配置文件到此临时文件。保持把手打开。
  3. 将临时文件名传递给DLL。它在您的过程中,因此不受独占锁的影响。
  4. 完成DLL后,将临时文件清零。
  5. 关上你的手柄。这将删除该文件。
  6. 由于临时文件在包含机密内容时被锁定,因此没有其他进程可以访问它。由于它被标记为临时删除,因此Windows不会将其刷新到物理磁盘。

    当然,这不是完美的安全性。任何能够读取你的进程内存(i..e有SeDebugPrivilege)的人都可以访问这些信息,但这很明显。只需在LoadConfigFile上放置调试断点即可。