在桌面应用程序中存储哈希、盐和密钥的位置

11
我正在想象如何在桌面应用程序中存储应用程序的秘密和密钥。例如Facebook应用程序密钥或Dropbox密钥和密钥。我已经阅读过,应该使用哈希、盐、加密等方法来保护这些值。这是为了防止有人通过逆向我的代码并查看密钥。这都很好,但是使用所有这些方法,我只是将某个地方的盐或哈希值存储起来,而不是密钥本身。最终,如果黑客可以获取盐/哈希值和可能的源代码,他们仍然可以解密加密的密钥并获取我的密码/密钥/秘密吗?
我阅读过的一个最安全的选择是根本不在桌面应用程序中存储此值,而是调用Web服务以获取密钥(可能是加密的)。但是我想问的是,即使在这种情况下,一位优秀的黑客也肯定会执行内存转储或其他操作,以查看从Web服务返回的值,然后我们回到起点。
下一个最佳选择似乎是隐匿性。我是否完全错过了什么?
顺便说一句,黑客会对Facebook/Twitter/Dropbox等秘钥感兴趣吗?毕竟他们还需要用户的凭据或访问令牌才能使用它?
欢迎任何建议或建议。

你无法阻止别人调试你的应用程序以获取密钥。 - Gumbo
1
那么,如果要创建类似Facebook/Dropbox/Twitter等需要使用应用程序秘钥/ID的桌面应用程序,应该采取哪些措施? - Quintonn
简单来说,如果您的应用程序在客户端设备上执行,则无法100%保护您的密钥和密码。但是您可以使用加密和混淆等技术使其更难读取。请参考此处的这些概念:https://dev59.com/TF8d5IYBdhLWcg3w6lyM - Andre Hofmeister
1
这个问题应该在程序员交流社区上问吧?这更多关乎最佳实践而非具体的代码。 - Steffen Winkler
我会去问一下,谢谢。我之前不知道那个堆栈,或者它被称为什么。 - Quintonn
显示剩余4条评论
1个回答

1
对于每个用户账户,在他们成功登录您的服务时为应用程序生成一个新的访问令牌。您的登录服务应该设计得像网站的登录一样:
  • API应只允许一定数量(比如5次)的错误登录尝试,并向桌面客户端报告用户名/密码不匹配。
  • 当用户成功登录时,API应返回仅与该用户相关联的令牌。
  • 使用SSL和本地散列方法将用户密码传递给您的API。

此由您的API提供的身份验证令牌仅适用于个人帐户,因此应仅允许用户对其个人帐户执行操作。例如,如果用户想执行某项操作,必须能够提供有效的身份验证令牌以完成操作。使用此方法,攻击者仍然可以获得身份验证密钥,但该身份验证密钥仅能执行生成它的帐户的操作,而不能对任何其他帐户执行操作。这里的思路是让攻击者操纵数据,但将不良活动限制在一个帐户中。

如果您确实有通用的API调用(例如图像搜索),可以从多个帐户访问数据,请确保您永远不会返回或允许任何帐户直接访问系统中的所有数据。仅提供有限数量的记录。在这种情况下,系统仍然可以执行其工作,但在任何时候都不允许访问系统中的所有记录。

我通常实现这样的服务:

  • 用户登录并获得身份验证令牌。我将该身份验证令牌存储在与该用户关联的数据库中。
  • 用户使用身份验证令牌调用Web服务。我通过传输的身份验证令牌和用户ID查找用户帐户(两种身份验证方式),并使用发现的用户帐户执行所有操作。我不仅仅假设用户ID是正确的,它必须是身份验证令牌针对的那个。
  • 如果用户需要执行敏感操作,例如重置密码,则我的应用程序会打开一个浏览器窗口或应用程序中的浏览器任务,用户可以在其中请求和管理重置。我可以更轻松地保护Web应用程序而不是未知客户端上的应用程序。

使用这些方法,您应该能够制作一个完全运行的桌面应用程序。如果您有任何异常情况,请在评论中发布,我们可以深入探讨问题,并查看此解决方案是否仍适用于您。


基本上,客户端应用程序用户不应直接调用Facebook/Twitter等。相反,我应该创建一个Web服务来验证和认证用户,然后代表他们进行这些调用? 这是有道理的,但会增加一些复杂性。但我想这是值得的。 - Quintonn
1
如果您需要更新服务与Facebook的交互方式,您会更愿意在服务器端更新代码,而不是让每个用户更新其应用程序吗?这样做可以更轻松地控制服务器上的安全性,而无需将其转移给客户端的应用程序。 - BajaBob

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接