我正在尝试创建一个桌面应用程序,该应用程序会将更新发送到我正在开发的Web服务。
理想情况下,该应用程序仅配置一次并部署到网络共享。在配置应用程序时,用户将输入用于在Web服务内进行身份验证的密码。之后,将创建一个令牌以用于将来的连接。
这将允许有权访问网络共享的任何计算机(即使不是配置该应用程序的计算机)也可以仅运行该应用程序(它将连接到Web服务)而无需输入任何凭据(因为令牌已保存)。
以下是我尝试过/考虑过的一些事情:
使用类似C#的SecureString
序列化令牌并将其存储在文件中:这是我所拥有的最好的。但是很明显,如果有人获得了对密钥文件的访问权,那么反转就很简单了。
This答案建议使用Windows Data Protection API (DPAPI)(在C#中为ProtectedData
类),但是显然,这将只允许最初保存凭据的用户访问它们,这将不起作用,因为我必须从多个用户/设备访问受保护的数据。
将令牌作为参数传递给应用程序:这只是更改了其中我要存储令牌(在批处理文件或OS任务上)例如,它调用了该程序),但我认为它不会使其变得更加安全。
答案 0 :(得分:1)
由于用户不是计算机的管理员(这是一个基本假设),因此有很多方法可以向她隐藏东西。
我建议的是:
以下是一些图形说明:
由于使用受保护的数据(Windows Data Protection)加密的数据只能由对其进行加密的Windows用户解密,因此登录的用户将无法读取“特殊用户”数据。
答案 1 :(得分:0)
我建议使用JWT。
您的服务器将在成功认证后生成令牌。令牌将被发送到客户端。随后每次对服务器的调用都会将标头中的令牌发送给服务器。然后,服务器将验证令牌。如果已验证,则服务器知道客户端已通过身份验证。
无需在客户端上存储用户名/密码。
答案 2 :(得分:0)
没有防弹方法可以解决此问题,客户端最终需要访问服务器,因此可以为客户端提供足够特权的攻击者。
您所描述的是OAuth2协议的典型情况,因为您可以控制服务器。使用OAuth2,您无法避免需要在客户端上存储机密,但是通过将其交换为令牌,可以保护原始密码,并且可以保证令牌非常强(用户密码往往很弱)。>
要将令牌/密码存储在客户端上,可以在存储之前对其进行加密,但这立即引发了一个问题,即将密钥存储在何处。攻击者可以从客户端提取它。有一些方法可以提高密钥存储的安全性。
答案 3 :(得分:0)
嗯,您不能在客户端保护任何东西。进入该目录后,任何具有特权访问权限的人都可以看到它。
您所能做的就是让这些信息毫无用处。
这里最好的方法是在客户端存储一种公钥,并使用此公钥创建一个哈希来通过Web服务对用户进行身份验证。
当用户配置应用程序时,服务器发送此公用密钥,该公用密钥存储在应用程序本地。当应用程序调用服务器时,它将使用此公钥和仅应用程序和服务器才知道的私钥创建哈希。然后服务器可以使用其私钥检查哈希是否正确。
为了提高安全性,您也可以在哈希中使用时间戳记,因此它将更改超时并防止密钥的重复使用。或者,它可以发送每个Web服务答案的新公钥。
答案 4 :(得分:0)
我建议您使用IdentityServer4,因为它提供了RFC兼容协议,并且根据GrantType,在您的上下文中为您的桌面应用程序提供了客户端应用程序。
即使令牌是纯文本形式的,它也会在Web服务中受到保护,其中访问控制(令牌的发行者)通过检查客户端请求中的Origin和存储在客户端中的令牌来验证是否从正确的客户端接收到了令牌。数据库。