如何在应用程序的二进制文件中存储秘密API密钥?

时间:2011-04-02 19:17:13

标签: twitter binary api-key secret-key

我正在为Mac OS X创建一个Twitter客户端,我有一个消费者秘密。根据我的理解,我不应该分享这个秘密密钥。问题是,当我把它作为字符串文字放入我的应用程序并使用它时,就像这样:

#define QQTwitterConsumerSecret @"MYSECRETYOUMAYNOTKNOW"

[[QQTwitterEngine alloc] initWithConsumerKey:QQTwitterConsumerKey consumerSecret:QQTwitterConsumerSecret];

它位于我的应用程序二进制文件的数据部分。黑客可以阅读此内容,反汇编应用程序等。

有没有安全的存储消费者秘密的方法?我应该加密吗?

4 个答案:

答案 0 :(得分:26)

没有真正完美的解决方案。无论你做什么,致力于它的人都可以偷走它。

甚至Twitter for iPhone / iPad / Android / mac /等。在那里有一把秘密密钥,他们可能只是以某种方式掩盖了它。

例如,您可以将其分解为不同的文件或字符串等。

注意:使用十六进制编辑器可以读取二进制文件中的ascii字符串,这是最简单的方法。通过将其分解为不同的部分或使用函数调用来创建密钥通常会使该过程更加困难。

答案 1 :(得分:7)

您可以对其进行base64编码以对其进行模糊处理。或者,更好的想法,生成密钥而不是仅仅存储它 - 写下这样的东西:

char key[100];
++key[0]; ... ; ++key[0]; // increment as many times as necessary to get the ascii code of the first character
// ... and so on, you get the idea.

然而,一个真正优秀的黑客无论如何都会找到它;真正保护它免受他人注意的唯一方法是使用安全散列函数,但是你也无法检索它:)

答案 2 :(得分:2)

您不应在不仅在您的服务器上运行的应用程序中使用秘密api密钥。

即使它被完全隐藏了......你也可以随时窥探通过电线传输的数据。而且由于它是您的设备,您甚至可以篡改SSL(中间的人使用自定义CA创建的证书,该证书已添加到设备的可信CA列表中)。或者您可以在实际加密之前挂钩SSL库以拦截数据。

答案 3 :(得分:0)

一个非常晚的答案......

如果您设置了自己的服务器,则可以使用它来帮助您在Twitter上获得用户授权的桌面应用,而无需共享(即:嵌入)您的密钥。

您可以使用此方法:

当用户安装桌面应用程序时,她必须使用twitter和服务器进行注册 *) *)应用程序要求服务器生成令牌请求URL *)服务器将生成的URL发送到应用程序 *)应用程序将用户定向到授权URL *)用户在twitter上授权您的应用并将生成的PIN粘贴到其中 *)使用PIN,您可以抓取令牌 *)所有进一步的通信都使用令牌而不涉及您的服务器

注意:应用程序使用服务器的用户凭据(例如:id和密码)登录到您的服务器。