UAObfuscatedString 0.5.1

UAObfuscatedString 0.5.1

测试已测试
Lang语言 SwiftSwift
许可 MIT
发布最新发布2018年4月
SwiftSwift 版本4.0
SPM支持 SPM

Matt Coneybeare维护。



  • Matt Coneybeare

UAObfuscatedString

UAObfuscatedString 是对 NSMutableString 的简单轻量级分类,允许您防止敏感字符串出现在您的编译后的二进制文件中。如果没有某种混淆,像后台 API 方法、url、API 密钥和其他敏感数据等字符串可以被利用各种命令行工具(如 strings)提取。

它是如何工作的?

当你编写带有字符串常量的代码时,这个字符串以明文形式保存在二进制中。黑客可能会发现漏洞或更改字符串以影响你的应用程序的行为。

UAObfuscatedString 只在二进制中存储单个字符,然后在运行时将它们组合成你的字符串。这些单个字母在二进制中脱颖而出的可能性非常小,因为它们将在编译代码的随机位置插入。因此,它们对于试图提取字符串的人来说看起来就像是随机代码。

安装

通过 CocoaPods
pod 'UAObfuscatedString', '0.3.2'

手动

  1. UAObfuscatedString.[h|m] 添加到你的项目中。
  2. 在需要使用的地方添加 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颜色方案