我们有一台服务器通过自定义登录程序将密钥安全地发送到客户端。该密钥随后用于加密进一步的客户端请求。该密钥保存在客户端的磁盘上,如cookie,并由一个程序使用,该程序可能会在客户端决定注销并导致密钥过时之前多次启动和停止(因此密钥保存在磁盘上,因为当没有程序运行时,登录和注销之间可能会有很长的时间段。
将密钥仅保存在内存而不是磁盘上似乎更安全一点(如果崩溃或重新启动丢失密钥并随后强制重新登录,则可以。)
在Windows上,在程序的单独执行之间,将密钥保留在内存中的最佳方法是什么(忽略内存可能是虚拟的并且分页到磁盘)?
一种可能的解决方案是在接受密钥的客户端上运行一个简单的Windows服务,将其保留在服务的内存中,并根据请求返回它(或使用执行相同操作的等效的简单DDE服务器)。首选非.NET解决方案。
是否有正常运行的标准Windows服务已经提供此功能?
有更好的方法吗?
答案 0 :(得分:1)
您可以尝试使用一些不涉及正在运行的流程的解决方案:
将其存储在易失性注册表项(REG_OPTION_VOLATILE)
将其存储在global atom table中。密钥必须存储为字符串。你可能需要两个原子;一个存储密钥,一个用于定位第一个原子,因此您可以调用GlobalGetAtomName。第二个原子应该有一个已知的名称,如“YourAppName:S-UsersSidGoesHere”,这样你就可以调用GlobalFindAtom。
如果您决定将其存储在%temp%的文件中,则可以使用TOKEN_STATISTICS.AuthenticationId作为用于加密真实密钥的密钥的一部分。您可以使用EFS(FILE_ATTRIBUTE_ENCRYPTED)加密文件本身......