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

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

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

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

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

  • 我知道将其存储在客户端永远不会完全安全,但我想让某人尽可能难以访问明文令牌。

  • 我正在寻找一个最好不依赖于任何操作系统资源的答案(因为应用程序可以从不同的设备执行)。

  • 假设我可以完全控制应用程序和网络服务器

  • 我正在使用 C# 开发控制台应用程序,但我认为这更多是一个理论问题(与任何特定语言无关)


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

  • 使用 C# 之类的东西序列化令牌SecureString并将其存储在文件中:这是我最好的方法。但显然,如果有人获得了对密钥文件的访问权限,就很容易逆转。

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

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


小怪兽爱吃肉
浏览 230回答 3
3回答

饮歌长啸

由于用户不是机器的管理员(这是一个基本假设),有很多方法可以向她隐藏东西。我的建议是:确保主应用程序在与登录用户(“特殊用户”)不同的凭据下运行。编写另一个最终用户应用程序,仅用于设置,与此应用程序对话(使用您认为合适的任何进程间通信,TCPIP 等等,可能是安全的,但我不会太在意这个)。此应用程序仅用于收集凭据并将其发送到第一个应用程序现在,主应用程序可以在登录用户无法访问的任何地方写入令牌,但我推荐受保护的数据,因为它非常易于使用这是一些图形解释:由于使用受保护数据(Windows 数据保护)加密的数据只能由对其进行加密的 Windows 用户解密,因此登录用户将无法读取“特殊用户”数据。

繁星淼淼

我建议您使用IdentityServer4,因为它提供符合 RFC 的协议,并且根据您的桌面应用程序上下文中的 GrantType 客户端应用程序。即使令牌是纯文本,它也受到 Web 服务的保护,其中访问控制(令牌的颁发者)通过检查客户端请求中的源和存储在数据库中的源来验证是否从正确的客户端接收了令牌。

慕少森

我建议使用JWT。您的服务器将在成功验证后生成一个令牌。令牌将被发送到客户端。对服务器的每次后续调用都会将标头中的令牌发送到服务器。然后服务器将验证令牌。如果经过验证,服务器就知道客户端已通过身份验证。无需在客户端存储用户名/密码。
打开App,查看更多内容
随时随地看视频慕课网APP