2

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

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

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

  • 我可以加密文件。-> 有人知道这方面的免费图书馆吗?-> 那么是否可以将文件作为字符串提供给函数并且函数可以读取文件?

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

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

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

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

4

3 回答 3

1

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

  1. 创建一个临时文件,并以独占方式打开它(甚至不共享读取)。通过FILE_ATTRIBUTE_TEMPORARYFILE_FLAG_DELETE_ON_CLOSE因为它不是持久的
  2. 将配置文件解密到这个临时文件。保持把手打开。
  3. 将临时文件名传递给 DLL。它在您的进程中,因此不受排他锁的影响。
  4. DLL 完成后,将临时文件归零。
  5. 关闭你的把手。这将删除文件。

由于临时文件只要包含机密内容就会被锁定,因此没有其他进程可以访问它。而且由于它被标记为临时的,关闭时删除,Windows 不会费心将它刷新到物理磁盘。

当然,这不是完美的安全性。任何可以读取您的进程内存(即拥有SeDebugPrivilege)的人都可以访问此信息,但这很明显。只需在LoadConfigFile.

于 2012-03-26T13:54:26.760 回答
1

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

在许多情况下,一个简单的自制加密机制可能足以吓跑临时读者。

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

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

于 2012-03-26T12:52:08.467 回答
1

我唯一能想到的——而且我手头没有它的源代码——是hash 和 decrypt

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

不过,每次更新代码时它都有可能会中断。您将不得不考虑 32 位和 64 位架构。也许指针调整可以发挥作用。确保您的安全要求值得付出努力,并且不要低估维护工作量。

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

于 2012-03-26T13:28:42.703 回答