UAObfuscatedString
UAObfuscatedString 是对 NSMutableString
的简单轻量级分类,允许您防止敏感字符串出现在您的编译后的二进制文件中。如果没有某种混淆,像后台 API 方法、url、API 密钥和其他敏感数据等字符串可以被利用各种命令行工具(如 strings
)提取。
它是如何工作的?
当你编写带有字符串常量的代码时,这个字符串以明文形式保存在二进制中。黑客可能会发现漏洞或更改字符串以影响你的应用程序的行为。
UAObfuscatedString 只在二进制中存储单个字符,然后在运行时将它们组合成你的字符串。这些单个字母在二进制中脱颖而出的可能性非常小,因为它们将在编译代码的随机位置插入。因此,它们对于试图提取字符串的人来说看起来就像是随机代码。
安装
通过 CocoaPods
pod 'UAObfuscatedString', '0.3.2'
手动
- 将
UAObfuscatedString.[h|m]
添加到你的项目中。 - 在需要使用的地方添加
import "UAObfuscatedString.h"
。
用法
该类别非常简单易用。每个字母a-Z都被转换成了一个方法名,它会将字母附加到被调用的字符串上。数字前面都加了下划线。大多数键盘字符(如逗号
和星号
)都有对应的方法,为了提高可读性,还有两个别名方法用于空格(_
)和句点(点
)。
NSLog(@"%@", NSMutableString.string.T.h.i.s._.i.s._.a._.t.e.s.t.dot);
> This is a test.
但通过使用包含的便利宏,我们可以使它看起来更加美观。
NSLog(@"%@", Obfuscate.T.h.i.s._.i.s._.a._.t.e.s.t.dot);
> This is a test.
除非有特定原因不这么做,否则建议使用Obfuscate
宏以提高可读性。
您可以在UAObfuscatedString.h
中找到完整的方法列表和支持的字符。
通常,您将使用此功能来处理像应用内购买标识符这样的东西,但有很多地方隐藏字符串是有意义的。
NSString *identifier = Obfuscate.c.o.m.dot.u.r.b.a.n.a.p.p.s.dot.e.x.a.m.p.l.e;
Swift 用法
虽然与 Objective-C 的实现类似,但 Swift 的用法略有不同。您需要从字符串字面量开始,然后添加其余部分。但是,您将无法使用下划线(_)来表示空格,因为在 Swift 中,下划线用来表示省略变量(通常在 Xcode 中使用命名的变量会导致警告时使用)。上面的用法示例代码使用 Swift 实现看起来是这样的。
print("T".h.i.s.space.i.s.space.a.space.t.e.s.t.dot)
> This is a test.
或
let identifier = "c".o.m.dot.u.r.b.a.n.a.p.p.s.dot.e.x.a.m.p.l.e
> com.urbanapps.example
Mac OS X 上的 "I" 字符
OS X 10.11 SDK 已经包含一个在I
下定义的宏,因此当为 Mac 编译时,该字符在 UAObfuscatedString 中有一个下划线。仍然可以使用I
进行仅限 iOS 的编译。
- (instancetype)_I;
性能
普通字符串常量的查找非常快。读取一个指针,然后从内存中获取该值。使用UAObfuscatedString计算成本更高。每个字母实际上是一个调用-[NSMutableString appendString]
方法的请求。虽然我还没有具体测量(贡献者@nickskull 已经做了),但我可以向你保证,如果你使用UAObfuscatedString来混淆你的表格单元格中的段落,你的滚动性能将会非常糟糕。
因此,建议你仅当需要的时候使用UAObfuscatedString,例如使用较短的字符串或可以缓存的字符串。
实现这一点的一个好方法是,在初始化时在内存中存储未混淆的字符串,以确保它们只被解密一次。
- (id)init {
if ((self = [super init])) {
self.IAPIdentifier = Obfuscate.c.o.m.dot.u.r.b.a.n.a.p.p.s.dot.e.x.a.m.p.l.e;
self.socialSecurityNumber = ...
}
return self;
}
你明白了。字符串加密的方法有很多种,这只是其中的一种。享受编程的乐趣。
开源Urban Apps项目
- Armchair - 一个简单但强大的iOS和OSX(Swift)应用评论管理器
- UAAppReviewManager - 用于iOS和Mac应用商店应用程序的应用评论提示工具。
- UALogger - 用于Mac/iOS应用的日志工具
- UAModalPanel - iOS的动画Modal面板替代方案
- UAProgressView - 一个简单且轻量级但功能强大的动画圆形进度条
- Urban - 使用柔和暗背景,具有微妙蓝色、橙色和黄色颜色的Xcode颜色方案