在桌面应用程序中存储散列,盐,键的位置

我试图找出我应该在桌面应用程序中存储应用程序秘密和密钥的位置或方式。
例如一个Facebook应用程序密钥或Dropbox密钥和秘密。

所以我读过,我应该散列,盐,encryption等等这些值。 这是为了防止有人反向工程我的代码,并看到钥匙。

这一切都很好,但所有这些方法,我只是存储一个盐或散列值,而不是关键本身,最后。 当然,如果黑客可以得到salt / hash和可能的源代码,他们将能够解密encryption的密钥并获得我的密码/密钥/秘密吗?

我已经读过的一个选项似乎是最安全的是不把这个值存储在桌面应用程序中,而是调用Web服务来获得密钥(可能是encryption的)。 但我的问题是,即使在这种情况下,一个体面的黑客肯定会做一个内存转储或东西,看看从Web服务返回的价值是什么,然后我们回到了广场1。

下一个最好的select似乎是默默无闻的。

我完全错过了什么吗?

在一个侧面说明,Facebook / Twitter / Dropbox / etc的密钥/秘密对黑客有什么用? 当然,他们仍然需要用户的凭据或访问令牌才能够使用它呢?

任何意见或build议,将不胜感激。

对于每个用户帐户,当他们成功login到您的服务时,为应用程序生成一个新的访问令牌。 您的login服务的devise应该像网站的login:

  • 该API应该只允许一个设置的数字(比如5)不良的login尝试,并向用户名/密码不匹配的桌面客户端报告。
  • 当用户成功login时,API应返回仅与该用户有关的令牌。
  • 使用SSL和本地化的散列方法将用户密码传递给您的API

由您的API提供的身份validation令牌只适用于个人帐户,因此只应允许用户对其个人帐户执行操作。 因此,例如,如果用户想要执行操作,则他们必须能够提供有效的authentication令牌来完成该操作。 使用这种方法,攻击者仍然可以获得授权密钥,但该授权密钥只能对其生成的帐户执行操作。 它将无法对任何其他帐户执行操作。 这里的想法是让他们混淆数据,但要保持不良活动划分到一个帐户。

从那里,如果你确实有通用的API调用(比如图片search)来访问多个帐户的数据,那么确保你永远不会返回或者允许任何帐户直接访问系统中的所有数据。 只提供有限数量的logging。 在这种情况下,系统仍然在执行它的工作,但是不允许访问系统中的所有logging。

我通常实现这样的服务:

  • 用户login并获取身份validation令牌。 我将所述authentication令牌存储在与该用户相关的数据库中。
  • 用户使用身份validation令牌调用We​​b服务。 我通过传输的authentication令牌和用户ID(两种authenticationforms)查找用户帐户,并使用发现的用户帐户执行所有操作。 我不只是假设用户ID是正确的,它必须是身份validation令牌进行身份validation的一个。
  • 如果用户需要执行微妙的操作(如重置密码),我的应用程序会在应用程序中打开浏览器窗口或浏览器任务,用户可以请求并pipe理重置。 我可以更容易地保护一个Web应用程序比一个未知的客户端。

使用这些方法,您应该能够创build一个完全可操作的桌面应用程序。 这个function有些exception,如果你有任何意见,我们可以进一步深入探讨这个问题,看看这个解决scheme是否仍然可以为你工作。