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

40 twitter binary api-key secret-key

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

#define QQTwitterConsumerSecret @"MYSECRETYOUMAYNOTKNOW"

[[QQTwitterEngine alloc] initWithConsumerKey:QQTwitterConsumerKey consumerSecret:QQTwitterConsumerSecret];
Run Code Online (Sandbox Code Playgroud)

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

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

Gra*_*sen 27

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

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

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

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

  • 值得注意的是,这就是为什么可以撤销API访问密钥的原因.如果它被盗(并且这是一个问题),只需撤销密钥并使用新密钥向用户推送更新的应用程序. (10认同)
  • @DanielDickison同样值得注意的是,推出新版移动应用程序需要时间,尤其是Apple. (4认同)

小智 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.
Run Code Online (Sandbox Code Playgroud)

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

  • 它也是最糟糕的一个,因为它总会产生碰撞 (10认同)
  • 我的观点是,有损/不可逆的哈希对于存储您需要作为身份验证令牌传输的密钥是无用的(而不是仅使用它来验证知道秘密的其他人). (4认同)
  • 在这种情况下,最安全的哈希函数是:`int hash(char*s){return 0; }` (3认同)