我试图弄清楚应该在哪里或如何在桌面应用程序中存储应用程序的秘密和密钥。 例如,Facebook应用程序密钥或保管箱密钥和机密。
所以我读到我应该哈希,加盐,加密等这些值。这是为了防止有人对我的代码进行反向工程并查看密钥。
都很好,但是使用所有这些方法,最后我只是将salt或hash值而不是密钥本身存储在某个地方。当然,如果黑客可以使用盐/哈希和可能的源代码,那么他们将能够解密加密密钥并获得我的密码/密钥/秘密吗?
我已经阅读过的一种似乎最安全的选择是根本不将这个值存储在桌面应用程序中,而是调用Web服务来获取密钥(可能是加密的)。但是我的问题是,即使在这种情况下,一个体面的黑客也肯定会进行一次内存转储或执行某种操作来查看Web服务返回的值是什么,然后我们回到平方1。
下一个最佳选择似乎是晦涩难懂。
我完全想念什么吗?
附带说明一下,无论如何,facebook / twitter / dropbox / etc key / secret对黑客有什么用?当然,他们仍然需要用户的凭据或访问令牌才能使用它吗?
任何意见或建议,将不胜感激。
为每个用户帐户成功登录到您的服务后,为应用程序生成一个新的访问令牌。您的登录服务应设计为类似于网站登录:
您的API提供的此身份验证令牌仅适用于个人帐户,因此,应仅允许用户对其个人帐户执行操作。因此,例如,如果用户要执行操作,则他们必须能够提供有效的身份验证令牌才能完成操作。使用此方法,攻击者仍然可以获取身份验证密钥,但是该身份验证密钥将仅能够对其生成帐户进行操作。它将无法对任何其他帐户执行操作。这里的想法是让他们弄乱数据,但将不良活动划分为一个帐户。
从那里开始,如果确实有访问来自多个帐户的数据的通用API调用(例如图像搜索),请确保您永远不会返回或允许任何帐户直接访问系统中的 所有 数据。仅提供有限数量的记录。在这种情况下,系统仍在执行其工作,但是决不允许访问系统中的所有记录。
我通常实现这样的服务:
使用这些方法,您应该能够制作一个完全可操作的桌面应用程序。如果您有任何异常,请在注释中添加这些功能,我们可以进一步深入探讨问题并查看该解决方案是否仍对您有效。