编写安全的Cocoa代码

4
我正在用Cocoa制作一个应用程序,想知道其中的一些字符串是否容易访问,所以我在上面运行了OTX,但遗憾的是我的所有代码都被发现了。有没有一种方法可以使我的代码更加“安全”,或者至少加密/隐藏字符串?我想加密字符串的原因是它是服务器的密码。我不需要它非常安全,我只是不希望密码太容易被发现。
谢谢任何帮助。

你提到的OTX是什么,如何使用它? - Dani Pralea
2个回答

8
您绝对不能将密码放入可执行文件中。这就像将密码贴在显示器旁边的便签上。如果一个恶意黑客获得了您的应用程序,无论您使用什么语言或API编写它,他们最终都可以提取密码。例如,如果我知道您的应用程序连接到受密码保护的服务器,但应用程序从未要求输入密码,那么我就知道您已经犯了把密码包含在内的错误。为了找到密码,我只需要监视程序的操作,以查看与其连接到服务器时活动的代码区域。无论您的应用程序有多大,这都会告诉我在哪里集中搜索密码。然后,只是时间的问题,我就能追踪到密码。加密密码也没有任何作用,因为加密算法也必须在应用程序中,而我也可以解密它。请记住,有很多人可以仅使用原始机器码来解读您的代码。对于这些人来说,不管您使用哪种语言或API,因为它们最终都会被转换为机器码,所以并不重要。这些人是具备恐怖技能的编程专家,他们嘲笑像您和我这样的凡人。不幸的是,其中一些人是邪恶的。我是否提过您绝对不能将密码放入可执行文件中?如果没有,让我再重复一遍,您绝对不能将密码放入可执行文件中。在您这种情况下,作为新手程序员,您不可能从比自己稍有经验的人那里隐藏密码。这是又一个很好的理由,为什么您绝对不能将密码放入可执行文件中。

1
谢谢回复。唯一的原因是它里面有密码,因为它只是给几个朋友使用,不会被分发。 - nosedive25
3
朋友?那你为什么要加密呢? :-) - Joshua Nozzi

6

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

因为ObjC的类系统严重依赖于运行时反射,整个接口需要与可执行文件一起包含。这使得像class-dump这样的工具可以轻松恢复二进制文件的源@interface。

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

2. 使用strip

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

3. 混淆。

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

4. 或者改变您的设计。

无论您的保护系统有多好,由于黑客对他们的机器拥有完全控制权,给予足够的时间,他们总是能获胜。最好重新设计,比如为什么密码必须随可执行文件一起?或者为什么需要全局密码?


谢谢您的回复。我不是很有经验的程序员,但我该如何将它更改为C函数? - nosedive25
1
@happy:不要使用 +(NSString*)getPassword;,而是在类外创建一个 static NSString* getPassword(void); - kennytm

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