测试已测试 | ✗ |
语言语言 | Obj-CObjective C |
许可证 | MIT |
发布上次发布 | 2015年7月 |
由PJ Engineering and Business Solutions Pty. Ltd.维护。
通过混淆所有硬编码的安全敏感字符串来保护您的应用。
安全敏感字符串可以是
此库通过混淆并作为十六进制编码后,将典型的NSStrings硬编码为C语言字符串。当您的应用需要原始未混淆的NSStrings时,它将动态地将它们解码回来。
这为好奇心强的人增加了一层额外的安全保护。
这让iPhone越狱的用户更难打开您的应用的执行文件,并在二进制文件中查找可能看起来“有趣”的字符串。
一般参考
此库(v2+)现在可以桥接到Swift。
通常您会在这里存储希望全局可用的敏感字符串。
文件(顶部菜单)->新建->文件...
对于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 步)。
当你的应用程序需要使用未混淆的字符串时
- (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 步中使用的一致。
这一步非常重要
请确保所有混淆的字符串都可以还原到原始版本。如果不能,则更改 Salt 重复尝试。如果即使有一个字符串无法 decipher,则 该特定 字符串不能与这个库一起使用。其他的可以。
- (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:]。
[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。
- (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。任何错误报告都将受到热情欢迎。