【发布时间】:2018-08-17 20:40:20
【问题描述】:
我正在尝试创建一个桌面应用程序,它将向我正在开发的网络服务发送更新。
理想情况下,应用程序只需配置一次并部署到网络共享。配置应用程序时,用户将输入用于在 Web 服务中进行身份验证的密码。之后,将创建一个令牌以用于未来的连接。
这将允许任何有权访问网络共享的计算机(即使它不是配置应用程序的计算机)只运行应用程序(将连接到网络服务)而无需输入任何凭据(因为令牌已保存)。
问题是:我应该如何保护这个令牌?
- 我知道将其存储在客户端永远不会完全安全,但我想让某人尽可能难以访问明文令牌。
- 我正在寻找一个最好不依赖于任何操作系统资源的答案(因为应用程序可以从不同的设备上执行)。
- 假设我可以完全控制应用程序和网络服务器
- 我正在使用 C# 开发控制台应用程序,但我认为这更多是一个理论问题(与任何特定语言无关)
以下是我尝试/考虑过的一些事情:
使用诸如 C# 的
SecureString之类的东西序列化令牌并将其存储在文件中:这是我提供的最好的。但是很明显,如果有人获得了密钥文件的访问权限,那么逆转是非常微不足道的。This 答案建议使用 Windows Data Protection API (DPAPI)(在 C# 中,
ProtectedData类),但显然,这将只允许最初保存凭据的用户访问它们,这是行不通的因为我必须从多个用户/设备访问受保护的数据。将令牌作为参数传递给应用程序:这只会更改在哪里我要存储令牌(在批处理文件或操作系统任务上例如,调用程序),但我认为它不会使它更安全。
【问题讨论】:
-
使用令牌和刷新令牌。这样您就可以使令牌无效。
-
@CodeCaster 我已经更新了这个问题。在这种情况下,存储令牌就像存储密码本身一样:有人可以复制它并用于连接到 Web 服务而无需进行身份验证,对吧?我想了解如何保护密码/令牌
-
你能定义你所说的“SO-independent”是什么意思吗?对于这里的大多数人来说,最常见的扩展是 Stack Overflow,我认为你不是这个意思。不幸的是,你使用它而不定义它。
-
@Damien_The_Unbeliever 感谢您的关注。这是一个错字,我的意思是独立于操作系统(OS)。我已经更新了问题:)
-
我上一次的编辑可能对这个问题有太大的改变,但我相信它现在最好地反映了我最初的意图。
标签: c# web-services authentication password-encryption