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

时间:2018-08-09 15:21:56

标签: c# web-services authentication password-encryption

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

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

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

问题是:我应如何保护此令牌?

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

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

  • 使用类似C#的SecureString序列化令牌并将其存储在文件中:这是我所拥有的最好的。但是很明显,如果有人获得了对密钥文件的访问权,那么反转就很简单了。

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

  • 将令牌作为参数传递给应用程序:这只是更改了其中我要存储令牌(在批处理文件或OS任务上)例如,它调用了该程序),但我认为它不会使其变得更加安全。

5 个答案:

答案 0 :(得分:1)

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

我建议的是:

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

以下是一些图形说明:

enter image description here

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

答案 1 :(得分:0)

我建议使用JWT

您的服务器将在成功认证后生成令牌。令牌将被发送到客户端。随后每次对服务器的调用都会将标头中的令牌发送给服务器。然后,服务器将验证令牌。如果已验证,则服务器知道客户端已通过身份验证。

无需在客户端上存储用户名/密码。

答案 2 :(得分:0)

没有防弹方法可以解决此问题,客户端最终需要访问服务器,因此可以为客户端提供足够特权的攻击者。

您所描述的是OAuth2协议的典型情况,因为您可以控制服务器。使用OAuth2,您无法避免需要在客户端上存储机密,但是通过将其交换为令牌,可以保护原始密码,并且可以保证令牌非常强(用户密码往往很弱)。

要将令牌/密码存储在客户端上,可以在存储之前对其进行加密,但这立即引发了一个问题,即将密钥存储在何处。攻击者可以从客户端提取它。有一些方法可以提高密钥存储的安全性。

  1. 根据您的情况,您可以考虑使用Hardware security module(HSM)。
  2. 您可以使用特定于操作系统的密钥存储,就像您在data-protection-api中提到的那样。密钥存储只能帮助保护密钥,因为它具有操作系统的支持(我想这就是您所说的独立于SO的意思吗?)。使用DPAPI,您不仅可以限制对登录用户的访问,还可以将其限制为本地计算机。密钥库也可以在其他操作系统上使用。
  3. 代替将密码存储在客户端上,可以在每次客户端启动时向用户请求密码。可以减少启动设备的时间,然后可以将密码专门保留在内存中。

答案 3 :(得分:0)

嗯,您不能在客户端保护任何东西。进入该目录后,任何具有特权访问权限的人都可以看到它。

您所能做的就是让这些信息毫无用处。

这里最好的方法是在客户端存储一种公钥,并使用此公钥创建一个哈希来通过Web服务对用户进行身份验证。

当用户配置应用程序时,服务器发送此公用密钥,该公用密钥存储在应用程序本地。当应用程序调用服务器时,它将使用此公钥和仅应用程序和服务器才知道的私钥创建哈希。然后服务器可以使用其私钥检查哈希是否正确。

为了提高安全性,您也可以在哈希中使用时间戳记,因此它将更改超时并防止密钥的重复使用。或者,它可以发送每个Web服务答案的新公钥

答案 4 :(得分:0)

我建议您使用IdentityServer4,因为它提供了RFC兼容协议,并且根据GrantType,在您的上下文中为您的桌面应用程序提供了客户端应用程序。

即使令牌是纯文本形式的,它也会在Web服务中受到保护,其中访问控制(令牌的发行者)通过检查客户端请求中的Origin和存储在客户端中的令牌来验证是否从正确的客户端接收到了令牌。数据库。