5

我在 cocoa 中制作了一个应用程序,想看看其中的某些字符串是否易于访问,所以我在上面运行了 OTX,遗憾的是我的所有代码都被找到了。有没有一种方法可以让我的代码更“安全”或至少加密/隐藏字符串?我想加密字符串的原因是它是服务器的密码。我不需要它真的很安全我只是不希望密码如此容易找到。

谢谢你的帮助

4

2 回答 2

8

永远不应该将密码放入可执行文件中。

这就像将密码放在显示器旁边的便签上。如果恶意黑客拥有您的应用程序,无论您使用什么语言或 API 编写密码,他们最终都可以提取密码。

例如,如果我知道您的应用程序连接到受密码保护的服务器,但该应用程序从不要求输入密码,那么我知道您犯了包含密码的错误。要找到密码,我只需要监视程序的运行,以查看在连接到服务器期间哪些代码区域处于活动状态。无论您的应用程序有多大,这都会告诉我在哪里集中搜索密码。然后,我追踪密码只是时间问题。加密密码没有好处,因为加密算法也必须在应用程序中,我也可以解开它。

请记住,有很多人可以仅使用原始机器代码来解开您的代码。对于那些人来说,你使用什么语言或 API 并不重要,因为他们最终都会提炼成机器代码。那些人是可怕的编程之神,他们嘲笑像你我这样的凡人。不幸的是,他们中的一些人是邪恶的。

我有没有提到您永远不应该将密码放入可执行文件中?如果我没有,让我重复一遍,您永远不应该将密码放入可执行文件中。

在您的特定情况下,作为新手程序员,您没有希望向比您更有经验的人隐藏密码。这是您永远不应将密码放入可执行文件的另一个充分理由。

于 2010-03-14T13:56:37.103 回答
6

1. 在安全代码中避免使用 ObjC。

因为 ObjC 的类系统在很大程度上依赖于运行时反射,所以整个接口需要与可执行文件一起包含。这允许工具class-dump轻松恢复二进制文件的源@interface。

因此,安全代码函数应编写为 C 函数,而不是 ObjC 方法。

2. 使用strip

默认情况下,编译器将保留所有私有符号(这使堆栈跟踪更具可读性)。您可以使用strip删除所有这些符号。

3. 混淆。

以上步骤只能隐藏代码逻辑。但是,如果密码是一个常量字符串,则使用该strings实用程序可以立即看到它。您可以通过在运行时构造密码来混淆这一点(例如,将编码为 ROT-13 的密码存储在文件中。)

4. 或者只是改变你的设计。

无论您的保护系统有多好,因为黑客可以完全控制他们的机器,只要有足够的时间,他们总是会获胜。最好修改您的设计,例如为什么密码必须与可执行文件一起提供?或者为什么甚至需要全局密码?

于 2010-03-14T13:10:46.503 回答