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

43

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

#define QQTwitterConsumerSecret @"MYSECRETYOUMAYNOTKNOW"

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

我的应用程序二进制文件中有数据部分。黑客可以读取这些数据,对应用程序进行反汇编等操作。

存储消费者秘密信息有什么安全的方法吗?我应该加密它吗?


5
如果你加密了它,仍然需要隐藏加密密钥。 - Null Set
1
@Null Set 如果黑客不知道加密算法怎么办? - user142019
1
除非该密钥涉及某种特权账户,否则没有理由将其保密甚至存在,Twitter 只是在做蠢事。如果它确实涉及特权账户,则不应该在你分享的应用程序中出现。 - R.. GitHub STOP HELPING ICE
1
@Radek Pro-Grammer:你为什么要打上“C”的标签?那段代码片段是Objective-C。 - Mat
@Mat 是的,但我不希望这个问题特定于任何语言。我会删除C标签。 - user142019
1
@Radek 在加密领域中,最好假设对手完全了解所使用的加密技术,并围绕此进行工作。 - Null Set
4个回答

29

没有真正完美的解决方案。无论你做什么,有人专门针对它就能够窃取它。

即使是Twitter的iPhone/iPad/Android/mac等应用程序中也有一个秘密密钥,他们很可能只是以某种方式将其隐藏起来。

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

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


10
值得注意的是,这就是为什么可以撤销API访问密钥的原因。如果它被盗(并且这是一个问题),只需撤销密钥并向您的用户推送带有新密钥的更新应用程序即可。 - Daniel Dickison
4
值得一提的是,推出新版本的移动应用需要时间,特别是在苹果平台上。 - noamtm

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.

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

3
在这种情况下,最安全的哈希函数是:int hash(char *s) { return 0; } - R.. GitHub STOP HELPING ICE
10
这也是最糟糕的一种,因为它总是导致碰撞。 - user500944
4
我的观点是,一个有损/不可逆的哈希对于存储需要作为身份验证令牌传输的密钥是无用的(与仅用于验证知道密钥的其他人不同)。 - R.. GitHub STOP HELPING ICE

2

在不仅限于您自己的服务器上运行的应用程序中,不应使用秘密API密钥。

即使它完全隐藏,您仍然可以窥探通过电线传输的数据。由于这是您的设备,您甚至可以篡改SSL(使用由添加到设备的受信任CA列表中的自定义CA创建的证书进行中间人攻击)。或者您可以钩入SSL库以在实际加密之前拦截数据。


13
那么将无法创建桌面版的Twitter客户端 :O - user142019
@Radek 如果您的桌面客户端连接到您的服务器,则不会出现此问题。 - Null Set
1
@Null Set:非常好的观点。现在我想起来,那几乎肯定是Twitter希望你这样做的。当然,这会导致你的应用程序侵犯用户的隐私(通过你的服务器传输他们的数据),并且如果你的服务器离线,它将停止工作,因此这是一个可怕的设计... - R.. GitHub STOP HELPING ICE
8
在大多数情况下,您的服务器希望提供原始服务器(Twitter)提供的所有服务。现在,您必须使用您的服务器对客户端应用进行身份验证。这会导致我们开始时遇到的完全相同的问题。 - Daniel Dickison
其实你只需要做你“不应该做”的事情。 - superarts.org
@user142019,您可以在应用程序中从您的网站打开一个Web视图。这将确保您的安全性以及功能的准备就绪。如果您不在服务器上存储数据,则可能无法使用此功能。 - dinwal

0

真的很晚的回答...

如果您设置自己的服务器,可以使用它来帮助桌面应用程序在不共享(即嵌入)您的秘密密钥的情况下获得用户在 Twitter 上的授权。

您可以使用以下方法:

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接