如何在应用程序的二进制文件中存储一个秘密的API密钥?
我正在创build一个Mac OS X的Twitter客户端,我有一个消费者的秘密。 这是我的理解,我不应该分享这个秘密钥匙。 问题是,当我把它作为一个string文字到我的应用程序,并使用它,如下所示:
#define QQTwitterConsumerSecret @"MYSECRETYOUMAYNOTKNOW" [[QQTwitterEngine alloc] initWithConsumerKey:QQTwitterConsumerKey consumerSecret:QQTwitterConsumerSecret];
它在我的应用程序的二进制文件的数据部分。 黑客可以阅读这个,反汇编应用程序,等等。
是否有任何安全的方式来存储消费者的秘密? 我应该encryption吗?
没有真正完美的解决scheme。 不pipe你做什么,专心致志的人都能偷走它。
即使Twitter的iPhone / iPad的/安卓/ mac /等。 有一个秘密钥匙,他们可能只是模糊了它。
例如,你可以把它分解成不同的文件或string等
注意:使用hex编辑器,你可以在二进制文件中读取asciistring,这是最简单的方法。 通过将其分解成不同的部分或使用函数调用来创build密钥通常会使该过程更加困难。
你可以对它进行64位编码来混淆它。 或者,更好的主意, 生成密钥,而不是只存储它 – 写这样的东西:
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.
然而,一个非常好的黑客无论如何都会发现它; 唯一能够真正保护他人眼睛的方法是使用安全的哈希函数,但是这样你也不能检索它:)
您不应该在不能在您的服务器上运行的应用程序中使用秘密api密钥。
即使它完全隐藏..你总是可以窥探通过电线的数据。 而且,由于这是您的设备,您甚至可以篡改SSL(中间的人员使用由设备的可信CA列表添加的自定义CA创build的证书)。 或者,您可以在实际encryption之前挂钩到SSL库中以截获数据。
一个真正迟到的答案…
如果你设置了自己的服务器,你可以使用它来帮助你的桌面应用程序获得用户在Twitter上授权而不共享(即:embedded)你的密钥。
你可以使用这种方法:
当用户安装你的桌面应用程序,她必须注册与Twitter和您的服务器*)*)应用程序要求服务器生成令牌请求的URL *)服务器发送生成的URL到应用程序*)该应用程序指示用户到授权URL *)用户在Twitter上授权您的应用程序,并将生成的PIN码粘贴到其中*)使用您的应用程序的PIN获取令牌*)所有进一步的通信使用令牌,不涉及您的服务器
注意:应用程序使用您的服务器的用户凭据(例如:id和密码)login到您的服务器。