混淆器 2.0.0

混淆器 2.0.0

测试已测试
语言语言 Obj-CObjective C
许可证 MIT
发布上次发布2015年7月

PJ Engineering and Business Solutions Pty. Ltd.维护。



混淆器 2.0.0

  • PJ Engineering and Business Solutions Pty. Ltd.

为iOS应用提供的App混淆器

通过混淆所有硬编码的安全敏感字符串来保护您的应用。

安全敏感字符串可以是

  • REST API凭据
  • OAuth凭据
  • 密码
  • 不打算公开的URL(即私人后端API端点)
  • 密钥 & 秘密

此库通过混淆并作为十六进制编码后,将典型的NSStrings硬编码为C语言字符串。当您的应用需要原始未混淆的NSStrings时,它将动态地将它们解码回来。

这为好奇心强的人增加了一层额外的安全保护。

这让iPhone越狱的用户更难打开您的应用的执行文件,并在二进制文件中查找可能看起来“有趣”的字符串。

一般参考

此库(v2+)现在可以桥接到Swift。

安装

创建Globals.h & Globals.m文件

通常您会在这里存储希望全局可用的敏感字符串。

文件(顶部菜单)->新建->文件...

创建前缀头文件

对于XCode 6,您需要从头开始创建一个pch文件(请参考此链接).

  • 添加到下面
//Now you do not need to include those headers anywhere else in your project.
#import "Globals.h"
#import <Obfuscator/Obfuscator.h>

使用方法

第一步

假设您正在使用Parse。为了使用他们的后端服务,他们将为您提供客户端密钥

clientKey:@"JEG3i8R9LAXIDW0kXGHGjauak0G2mAjPacv1QfkO"

由于字符串是硬编码的,它将直接嵌入到可执行二进制文件中 - 很容易被别有用心的人轻易窃取。

我们需要将其编码为十六进制编码的全局C字符串。

Obfuscator *o = [Obfuscator newWithSalt:[AppDelegate class],[NSString class], nil];  //Use any class(es) within your app that won't stand out to a hacker

[o hexByObfuscatingString:@"JEG3i8R9LAXIDW0kXGHGjauak0G2mAjPacv1QfkO"];

这将打印以下代码到XCode控制台输出(NSLog

Objective-C Code:
extern const unsigned char *key;
//Original: JEG3i8R9LAXIDW0kXGHGjauak0G2mAjPacv1QfkO
const unsigned char _key[] = { 0x7E, 0x23, 0x25, 0xB, 0xB, 0xF, 0x31, 0x9, 0x7B, 0x70, 0x3B, 0x7F, 0x21, 0x35, 0x9, 0x52, 0x6D, 0x21, 0x2C, 0x7F, 0xE, 0x4, 0x43, 0x52, 0x53, 0x54, 0x75, 0x4, 0x5C, 0x27, 0xB, 0x36, 0x3, 0x5B, 0x15, 0x52, 0x60, 0x5E, 0xE, 0x2E, 0x00 };
const unsigned char *key = &_key[0];

在部署您的应用前,请删除所有对hexByObfuscatingString:方法的引用。这完全是用来获取上面的Objective-C代码的。

第二步

将第一步中的extern const unsigned char *key;复制到Globals.h中。

将第一步中的const unsigned char *_key[] = ...复制到Globals.m中。

将《第 1 步》中的 const unsigned char *key = &_key[0]; 复制到 Globals.m

请记住将 key 改成更有意义的名称,例如 parseKey

将原始字符串作为注释添加到 Globals.m 中是个不错的方法,以防你需要再次对其重新编码(即第 4 步)。

第 3 步

当你的应用程序需要使用未混淆的字符串时

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {

    Obfuscator *o = [Obfuscator newWithSalt:[AppDelegate class],[NSString class], nil]; //The salt MUST match Step 1

    /* INSTEAD OF THIS:
    [Parse setApplicationId:@"TestApp"
              clientKey:@"JEG3i8R9LAXIDW0kXGHGjauak0G2mAjPacv1QfkO"];
     */


    [Parse setApplicationId:@"TestApp"
                clientKey:[o reveal:parseKey];

    return YES;
}

reveal: 方法中使用的 Salt 必须与第 1 步中使用的一致。

第 4 步

这一步非常重要

请确保所有混淆的字符串都可以还原到原始版本。如果不能,则更改 Salt 重复尝试。如果即使有一个字符串无法 decipher,则 该特定 字符串不能与这个库一起使用。其他的可以。

更高级的使用方法

第 1 步 - 生成 Objective-C 代码

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {

    [Obfuscator generateCodeWithSalt:@[[NSString class], [AppDelegate class], [NSObject class]]
                         WithStrings:@[
                                       @{@"id": @"AA", @"string":@"testSecret"},
                                       @{@"id": @"BB", @"string":@"testKey"},
                                       @{@"id": @"CC", @"string":@"parseKey1234"},
                                       ]];


    return YES;
}

这将输出

Salt used (in this order): [AppDelegate class],[NSObject class],[NSString class],

Objective-C Code:
**********Globals.h**********
extern const unsigned char *AA;
extern const unsigned char *BB;
extern const unsigned char *CC;

**********Globals.m**********
//Original: "testSecret"
const unsigned char _AA[] = { 0x41, 0x51, 0x46, 0x44, 0x62, 0x52, 0x55, 0x44, 0x3, 0x4C, 0x00 };
const unsigned char *AA = &_AA[0];

//Original: "testKey"
const unsigned char _BB[] = { 0x41, 0x51, 0x46, 0x44, 0x7A, 0x52, 0x4F, 0x00 };
const unsigned char *BB = &_BB[0];

//Original: "parseKey1234"
const unsigned char _CC[] = { 0x45, 0x55, 0x47, 0x43, 0x54, 0x7C, 0x53, 0x4F, 0x57, 0xA, 0x56, 0x56, 0x00 };
const unsigned char *CC = &_CC[0];

复制并粘贴生成的代码。

注意:由于原始排列无法混淆所有 3 个字符串,Salt 的顺序已经被重新排列。

该算法将遍历 Salt 的所有排列来最大化它所能够混淆的字符串数量。有时可能不会完全成功,所以输出将指示哪些字符串没有被混淆。对于未被混淆的字符串,尝试一个完全不同的 Salt 或者在 Salt 列表中添加更多类,然后再次尝试。添加的类越多,混淆所有字符串的成功机会就越高。

在 production 中删除 [Obfuscator generateCodeWithSalt:WithStrings:]。

第 2 步 - 将 Salt 存储在键值内部数据库中

[Obfuscator storeKey:@"swift" forSalt:[AppDelegate class],[NSObject class],[NSString class], nil];

如果你的项目是用 Objective-C 编写的,在第一步骤之后还有其他未记录的处理方法。但是,这是 Swift 项目必须采取的唯一方式。这种方式在 Swift 和 Objective-C 中都有效。

**注意:应用于 storeKey:forSalt: 的 Salt 列表必须按照第 1 步的输出进行排序。这种排列可能与应用于 generateCodeWithSalt:WithStrings: 的参数不同。

如果你选择使用不同的 Salt 对多个字符串进行混淆,你可以使用不同的键来识别不同的 Salt。

第 3 步 - 当你需要使用时动态解码混淆的字符串。

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {

    /* INSTEAD OF THIS:
    [Parse setApplicationId:@"TestApp"
              clientKey:@"JEG3i8R9LAXIDW0kXGHGjauak0G2mAjPacv1QfkO"];
     */


    [Parse setApplicationId:@"TestApp"
                clientKey:[Obfuscator reveal:CC UsingStoredSalt:@"swift"];

    return YES;
}

对于 Swift

    Obfuscator.reveal(CC, usingStoredSalt: "swift")

其他有用包

查看 "github.com/pjebs/EasySocial" 库。这是 Twitter 和 Facebook 最容易、最简单的 iOS 库。只需拖入即可使用!

查看 "github.com/pjebs/optimus-go" 包。使用 Knuth 算法进行 ID 哈希化和混淆。(适用于数据库等)

作者致谢

最终说明

如果你觉得这个包很有用,请在 github 上 Star 它。欢迎 fork 或提供 pull requests。任何错误报告都将受到热情欢迎。

PJ Engineering and Business Solutions Pty. Ltd.