我想在Windows上安全地存储共享密钥,但是可以通过在可能不同的用户帐户下运行的应用程序访问此密钥。在OSX上,解决方案是将密钥放入系统密钥链中,并使用适当的ACL将密钥的访问权限限制为仅需要使用密钥的各种应用程序。
在Windows上,安全存储(CryptProtectData()
和CryptUnprotectData()
)允许我存储为特定用户加密的机密,但似乎不允许限制对特定进程的密钥的访问。此外,无法使用CryptProttectData
来保护数据以供不同用户访问。
似乎我唯一的选择是Windows服务,(1)使用CryptProtectData()
安全地存储密钥数据,(2)通过WCF端点公开密钥数据,处理我的服务中的身份验证/授权。这似乎很重(并且容易出错)。这是我唯一的选择吗?
答案 0 :(得分:2)
更好的选择是将其存储在文件中(可能是加密形式)并在文件上设置ACL。问题是您无法基于每个应用程序控制访问(仅基于per-user_account)。因此,如果您需要精细控制,那么您需要实现Web服务,或创建具有访问控制的虚拟文件系统并通过该虚拟文件系统公开密钥(这也需要一个控制应用程序,就像服务一样)。
答案 1 :(得分:2)
嗯......您可以配置CryptProtectData()
进行加密,以便在您进行加密时通过指定CRYPTPROTECT_LOCAL_MACHINE
标志来解密/访问不同用户的数据;这将允许同一台计算机上的任何用户帐户使用CryptUnprotectData()
解密数据。
对于特定应用程序与特定用户,Windows中没有直接的方法来执行此操作。 Windows的安全模型基于使用用户帐户来控制对资源的访问,所以你真的离开了这个。
我不知道你有什么用例,但你可以考虑在一个普通用户帐户下运行需要访问这些数据的应用程序(使用run-as功能),然后将对受保护数据的访问权限限制为用户帐号。