3

我们有一个服务器,它通过自定义登录程序安全地向客户端发送密钥。该密钥随后用于加密进一步的客户端请求。该密钥像 cookie 一样保存在客户端的磁盘上,并由可能在客户端决定注销并导致密钥过时之前多次启动和停止的程序使用(因此密钥保存在磁盘上,因为当没有程序运行时,登录和注销之间可能有很长的时间)。

将密钥仅保存在内存中而不是磁盘上似乎更安全(如果崩溃或重新启动丢失密钥并随后强制重新登录,这没关系)。

在 Windows 上,在程序的单独执行之间仅将密钥保留在内存中(忽略内存可能是虚拟的并分页到磁盘)的最佳方法是什么?

一种可能的解决方案是让一个普通的 Windows 服务在接受密钥的客户端上运行,将其保留在服务的内存中,并在请求时返回它(或使用执行相同操作的等效普通 DDE 服务器)。首选非.net 解决方案。

是否有一个通常运行的标准 Windows 服务已经提供了这种能力?

有更好的方法吗?

4

1 回答 1

1

您可能可以尝试几种不涉及正在运行的进程的解决方案:

  • 将其存储在易失性注册表项(REG_OPTION_VOLATILE)中

  • 将其存储在全局原子表中。密钥必须存储为字符串。您可能需要两个原子;一个存储密钥,一个用于定位第一个原子,以便您可以调用 GlobalGetAtomName。第二个原子应该有一个已知名称,如“YourAppName:S-UsersSidGoesHere”,这样您就可以调用 GlobalFindAtom。

如果您决定将其存储在 %temp% 的文件中,您可以使用TOKEN_STATISTICS.AuthenticationId作为用于加密真实密钥的密钥的一部分。您可以使用 EFS (FILE_ATTRIBUTE_ENCRYPTED) 加密文件本身...

于 2012-05-24T22:16:19.203 回答