Obfuscator-iOS, 通过混淆所有硬编码的安全敏感字符串来保护你的应用程序

分享于 

10分钟阅读

GitHub

  繁體 雙語
Secure your app by obfuscating all the hard-coded security-sensitive strings.
  • 源代码名称:Obfuscator-iOS
  • 源代码网址:http://www.github.com/pjebs/Obfuscator-iOS
  • Obfuscator-iOS源代码文档
  • Obfuscator-iOS源代码下载
  • Git URL:
    git://www.github.com/pjebs/Obfuscator-iOS.git
    Git Clone代码到本地:
    git clone http://www.github.com/pjebs/Obfuscator-iOS
    Subversion代码到本地:
    $ svn co --depth empty http://www.github.com/pjebs/Obfuscator-iOS
    Checked out revision 1.
    $ cd repo
    $ svn up trunk
    
    用于iOS应用的应用程序混淆程序

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

    安全敏感字符串可以是:

    • REST API 凭据
    • OAuth凭据
    • 密码
    • public ( 例如 ) 不打算知道的url。 private 后端API端点)
    • 密钥&密钥

    这个库硬编码典型的NSStrings作为C 语言字符串,通过混淆,然后编码为十六进制。 当应用程序需要原始 unobfuscated NSStrings时,它会动态地将。

    它增加了一个额外的安全层。

    这使得用于打破iphone的可以执行文件的人更困难,然后寻找嵌入在'有趣'中的字符串。

    请参见一般情况:

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

    安装

    CocoaPods

    pod'混淆器','> 2.0"'

    创建 Globals.h & Globals.m-文件

    这通常是存储你想要全局可用的敏感字符串的地方。

    文件( 顶部菜单) -> New-> 文件。

    创建前缀头

    对于 XCode 6,你需要从头开始创建一个 pch 文件

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

    用法

    步骤 1

    假设你使用的是解析。 为了使用后端服务,他们将向你提供一个客户端密钥:

    clientKey:@"JEG3i8R9LAXIDW0kXGHGjauak0G2mAjPacv1QfkO"

    由于字符串是硬编码的,它将被烘焙到可以执行的二进制文件中。

    我们需要将它编码为一个以十六进制编码的全局c 字符串。

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

    这将在XCode控制台输出( NSLog ) 中输出以下代码:

    Objective-C Code:externconstunsignedchar *key;//Original: JEG3i8R9LAXIDW0kXGHGjauak0G2mAjPacv1QfkOconstunsignedchar _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 };constunsignedchar *key = &_key[0];

    在部署应用程序前删除所有对 hexByObfuscatingString: 方法的引用。 它仅用于获取上面的objective-c 代码。

    步骤 2

    复制 extern const unsigned char *key;步骤 1Globals.h

    复制 const unsigned char *_key[] =.. .步骤 1Globals.m

    复制 const unsigned char *key = &_key[0];步骤 1Globals.m

    记住将 key 更改为更有意义的东西,如 parseKey

    Globals.m 中添加原始字符串作为注释可以能是一个好主意,如果需要重新编码( 例如 )。 步骤 4 )。

    步骤 3

    当你的应用程序需要使用unobfuscated字符串时:

    - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
     Obfuscator *o = [Obfuscator newWithSalt:[AppDelegate class],[NSStringclass], nil]; //The salt MUST match Step 1/* INSTEAD OF THIS: [Parse setApplicationId:@"TestApp" clientKey:@"JEG3i8R9LAXIDW0kXGHGjauak0G2mAjPacv1QfkO"];*/ [Parse setApplicationId:@"TestApp"clientKey:[o reveal:parseKey];
     returnYES;
    }

    reveal: 方法使用的食盐必须 MATCH 步骤 1中使用的Salt。

    步骤 4

    这一步的是非常重要的。

    再次检查你的模糊字符串的所有是否可以恢复到原来的原始状态。 如果没有,那么改变salt并再次尝试。 如果一个字符串不能是 unofuscated,那么就不能在这个库中使用特定的字符串。 其他人可以。

    更高级用法

    步骤 1-- 生成 objective-c-代码

    - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
     [Obfuscator generateCodeWithSalt:@[[NSStringclass], [AppDelegate class], [NSObject class]]
     WithStrings:@[
     @{@"id": @"AA", @"string":@"testSecret"},
     @{@"id": @"BB", @"string":@"testKey"},
     @{@"id": @"CC", @"string":@"parseKey1234"},
     ]];
     returnYES;
    }

    这将在控制台日志中输出:

    Salt used (in this order): [AppDelegate class],[NSObject class],[NSString class],
    Objective-C Code:
    **********Globals.h**********
    extern const unsigned char *AA;externconstunsignedchar *BB;externconstunsignedchar *CC;
    **********Globals.m**********//Original:"testSecret"constunsignedchar _AA[] = { 0x41, 0x51, 0x46, 0x44, 0x62, 0x52, 0x55, 0x44, 0x3, 0x4C, 0x00 };constunsignedchar *AA = &_AA[0];//Original:"testKey"constunsignedchar _BB[] = { 0x41, 0x51, 0x46, 0x44, 0x7A, 0x52, 0x4F, 0x00 };constunsignedchar *BB = &_BB[0];//Original:"parseKey1234"constunsignedchar _CC[] = { 0x45, 0x55, 0x47, 0x43, 0x54, 0x7C, 0x53, 0x4F, 0x57, 0xA, 0x56, 0x56, 0x00 };constunsignedchar *CC = &_CC[0];

    复制并粘贴生成的代码。

    :由于原始排列无法使所有 3个字符串模糊而重新排序的Salt。

    算法将遍历 Salt的所有排列以最大化它能够混淆的字符串数。 有些时候,它不会完全成功,所以输出会指示哪些字符串没有被模糊。 对于unobfuscated字符串,尝试完全不同的salt,或者将更多的类添加到salt列表中,然后重试。 添加的类越多,混淆所有字符串的机会就越大。

    用于生产的删除 [Obfuscator generateCodeWithSalt:WithStrings:]。

    步骤 2-- 在 key-value 内部数据库中存储 Salt

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

    如果项目是用 objective-c 编写的,则步骤 1后还有其他未文档化的方法。 然而,这是基于 Swift的项目的唯一方法。 这种方式也可以在 Swift 和 objective-c 中工作。

    NB: 应根据步骤 1中的输出排序应用于 storeKey:forSalt:的Salt列表。 这里安排可能与应用到 generateCodeWithSalt:WithStrings:的参数不同。

    如果你选择使用不同的salt模糊多个字符串,则可以使用不同的键标识不同的salt。

    当你需要使用模糊的字符串时,第2 步- Dynamically。

    - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
     /* INSTEAD OF THIS: [Parse setApplicationId:@"TestApp" clientKey:@"JEG3i8R9LAXIDW0kXGHGjauak0G2mAjPacv1QfkO"];*/ [Parse setApplicationId:@"TestApp"clientKey:[Obfuscator reveal:CC UsingStoredSalt:@"swift"];
     returnYES;
    }

    为 swift:

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

    其他有用的软件包

    查看 "github.com/pjebs/EasySocial" 插件库。 Twitter 和Facebook最简单最简单的iOS库。 只要进去使用 !

    查看 "github.com/pjebs/optimus-go" 软件包。 利用knuth算法实现内部标识散列和模糊。 ( 数据库等)

    :

    的最终注释

    如果你发现这个软件包有用,请在github上为Star服务收费。 欢迎 fork 或者提供请求请求。 任何 Bug 报告都将被热烈欢迎。

    PJ工程和商业解决方案股份有限公司。 有限公司


    cod  str  安全  HAR  String  secure  
    相关文章