这是人们多年来一直在追求的一个问题,任何有足够动力的有技能的人都能够找到方法找到你不希望他们找到的任何信息,如果这些信息曾经存储在设备上.
无需越狱,就可以使用购买或下载的二进制文件来反汇编应用程序。这是静态检查,可使用标准拆卸工具进行检查。尽管您需要一个足够好的工具来从链接器添加符号并充分理解方法调用,以便能够梳理出正在发生的事情。如果您想了解它的工作原理,请查看hopper,它是一个非常好的拆卸/逆向工程工具。
特别是对于有问题的安全日志,如果您有一个积极的攻击者,您将面临更大的问题:基于系统的中间人攻击。在这种情况下,攻击者可以隐藏系统使用的网络代码,并查看通过标准网络发送的任何内容。因此,您不能指望能够将任何形式的未加密数据发送到操作系统或库级别的“安全”管道中,并期望它不会被看到。在将数据输入管道之前,您至少需要进行加密(即,您不能依赖将任何纯文本发送到标准 SSL 库)。您可以编译自己的一组 SSL 库并将它们直接链接到您的应用程序,这意味着您不会随着时间的推移获得任何系统性能和安全性增强,但您可以根据需要手动升级您的 SSL 库。
但是,所有这些都假设您的攻击者有足够的动机。如果您移除了唾手可得的果实,您可能能够防止临时黑客进行简单的尝试来破解您的系统。一些要避免的事情:
- 为加密的任一侧存储纯文本加密密钥
- 将密钥存储在特定命名的资源中(命名的文件
serverkey.text
或存储在 plist 中的密钥,其名称包含key
都是经典的)
- 尽可能避免使用简单的密码
但是,最重要的是创建系统,其中存储在应用程序本身中的密钥(如果有)在没有用户必须自己输入的信息(直接或间接通过诸如 OAUTH 之类的系统)的情况下是无用的。如果没有与可信任的用户进行一些交互,服务器不应该信任客户端的任何重要操作。
Apple 的 Keychain 提供了一个存储身份验证令牌的好地方,例如在 OAUTH 序列中检索到的那些。API 有点难以使用,但系统是可靠的。
最后,问题在于,无论你做什么,你都只是在加大工作量,才能打败你的措施。攻击者可以控制方程式的所有重要部分,因此他们最终会击败设备上的任何东西。您将需要决定在保护客户端、保护服务器和监控滥用方面付出多少努力。由于攻击者掌握了设备上的所有卡片,因此您更好的方法将是可以在服务器上实施以增强您的目标的方法。