“安全”存储(在客户端)令牌以供重用?

app*_*yip 8 c# authentication web-services password-encryption

我正在尝试创建一个桌面应用程序,它将更新发送到我正在开发的网络服务。

理想情况下,应用程序只需配置一次并部署到网络共享。配置应用程序时,用户将输入用于在 Web 服务中进行身份验证的密码。之后,将创建一个令牌以用于将来的连接。

这将允许任何有权访问网络共享的计算机(即使它不是配置应用程序的计算机)只运行应用程序(将连接到 Web 服务),而无需输入任何凭据(因为令牌具有已被保存)。

问题是:我应该如何保护这个令牌?

  • 我知道将其存储在客户端永远不会完全安全,但我想让某人尽可能难以访问明文令牌。
  • 我正在寻找一个最好不依赖于任何操作系统资源的答案(因为应用程序可以从不同的设备执行)。
  • 假设我完全控制应用程序和网络服务器
  • 我正在使用 C# 开发控制台应用程序,但我相信这更多的是一个理论问题(与任何特定语言无关)

以下是我尝试/思考过的一些事情:

  • 使用 C# 之类的方法序列化令牌SecureString并将其存储在文件中:这是我所拥有的最好的方法。但显然,如果有人获得了密钥文件的访问权限,则逆转非常简单。

  • 这个答案建议使用Windows 数据保护 API (DPAPI)(在 C# 中,ProtectedData该类),但显然,这将只允许最初保存凭据的用户访问它们,这是行不通的,因为我必须访问受保护的凭据。来自多个用户/设备的数据。

  • 将令牌作为参数传递给应用程序:这只会更改我要存储令牌的位置(例如,在调用程序的批处理文件或操作系统任务上),但我认为它不再有效安全的。

Sim*_*ier 3

由于用户不是机器的管理员(这是一个基本假设),因此有很多方法可以向她隐藏信息。

我的建议是:

  • 确保主应用程序在与登录用户(“特殊用户”)不同的凭据下运行。
  • 编写另一个最终用户应用程序,仅用于设置,与此应用程序对话(使用您认为合适的任何进程间通信,TCPIP,等等,也许是安全的,但我对此不太关心)。此应用程序仅用于收集凭据并将其发送到第一个应用程序
  • 现在,主应用程序可以在登录用户无权访问的任何地方写入令牌,但我建议使用受保护的数据,因为它非常易于使用

这是一些图形解释:

在此输入图像描述

由于使用受保护数据(Windows 数据保护)加密的数据只能由对其进行加密的 Windows 用户解密,因此登录用户将无法读取“特殊用户”数据。