我想给一个守护进程风格的进程(即没有用户交互)访问一个共享的密钥,这样它就可以访问一个共享的、加密的数据文件。访问相同加密数据的用户应用程序将共享密钥存储在用户的操作系统钥匙串中(例如 OS X 钥匙串或 Gnome 钥匙圈等)。操作系统钥匙串反过来用用户的登录(或其他用户特定的)密码保护密钥。
此处的加密用于在数据在服务器和客户端之间传输公共网络时保护数据。有问题的数据是来自科学实验的原始数据。大多数是无价值的(即不太可能吸引攻击者推测性地破坏加密并浏览数据),但其中一些可能非常有价值,用户希望将其详细信息保密,直到他们选择公开共享(即保护它来自网络上的临时观察者)。如果没有科学分析,数据的价值很难确定,因此观察用户在传输未加密线路时的活动(包括查询)将为观察者提供一些关于数据价值的线索。
守护进程是系统的查询服务器。它从共享数据中读取,处理查询,并将结果集的标识符返回给客户端,然后客户端从共享存储中提取标识的数据。
我们允许将加密数据同步到用户的本地工作站/笔记本电脑,因此磁盘上的数据加密对于坚定的攻击者至多是一种滋扰。我们还允许用户在本地运行查询服务器(仍然由 init.d/launchd 启动),所以我想尽我所能保护与守护进程一起存储的密钥。主要风险是确定的恶意用户能够从其系统上的守护程序中发现密钥。泄露该密钥将要求我们更改密钥、更新所有用户的密钥,然后重新加密数据库。
为守护进程存储共享密钥的最佳方式是什么?我可以将密钥放在磁盘上并加密磁盘上的文件,但是守护进程必须拥有解密该文件的密钥。这似乎等同于仅拥有原始加密数据的共享密钥。我天真的方法是将密钥存储在应用程序的二进制文件中,但我无法想象这是最好的选择。有什么建议吗?