美文网首页ios 逆向开发
《iOS防护07》字符串加密

《iOS防护07》字符串加密

作者: 不仅仅是个程序猿 | 来源:发表于2020-11-02 21:20 被阅读0次

    项目中经常要用到一些重要的字符串,本文主要介绍如何对对称加密中的salt(盐)进行加密。

    通过分析应用的MachO可执行文件,我们可以在常量区找到应用中定义的常量,比如上面的demo,AES加密的key为"abc",我们用MachOView分析这个demo如下:


    image.png

    key ”abc“在字符串常量区很容易的被定位到了,一旦加密的key泄露了应用被入侵的风险就变高了。所以我们需要隐藏这个字符串常量key.

    先拿个例子分析下:

    #import "ViewController.h"
    #import "EncryptionTools.h"
    
    @interface ViewController ()
    
    @end
    
    //盐,salt
    NSString *const AES_KEY = @"ABCDEF";
    
    @implementation ViewController
    
    - (void)encyptString:(NSString *)str {
        NSString *encyptedString = [[EncryptionTools sharedEncryptionTools] encryptString:str keyString:AES_KEY iv:nil];
        NSLog(@"加密后的字符串:%@",encyptedString);
    }
    
    - (void)viewDidLoad {
        [super viewDidLoad];
        
        self.view.backgroundColor = [UIColor whiteColor];
    }
    
    - (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
        [self encyptString:@"12345"];
    }
    
    @end
    

    我们得到项目的MachO文件后,通过Hopper可以容易的看出上面加密算法中的字符串“ABCDEF”。


    截屏2020-11-02下午8.56.30.png

    下面就来说说如何让加密的盐更加安全。可以利用C函数脱符号的特征进行隐藏,如下通过调用C函数的方式返回Key。

    修改后的代码:

    #import "ViewController.h"
    #import "EncryptionTools.h"
    
    @interface ViewController ()
    
    @end
    
    #define STRING_ENCRYPT_KEY 0xAB
    
    @implementation ViewController
    
    static NSString *AES_KEY () {
        //采用这样的方式,这些字符不会进入字符常量区,编译器直接换算成异或结果
        unsigned char key[] = {
            (STRING_ENCRYPT_KEY ^ 'A'),
            (STRING_ENCRYPT_KEY ^ 'B'),
            (STRING_ENCRYPT_KEY ^ 'C'),
            (STRING_ENCRYPT_KEY ^ 'D'),
            (STRING_ENCRYPT_KEY ^ 'E'),
            (STRING_ENCRYPT_KEY ^ 'F'),
            (STRING_ENCRYPT_KEY ^ '\0'),
        };
        unsigned char *p = key;
        while (((*p) ^ STRING_ENCRYPT_KEY) != '\0') {
            p++;   //2次异或使字符还原
        }
        return [NSString stringWithUTF8String:(const char *)key];
    }
    
    - (void)encyptString:(NSString *)str {
        NSString *encyptedString = [[EncryptionTools sharedEncryptionTools] encryptString:str keyString:AES_KEY() iv:nil];
        NSLog(@"加密后的字符串:%@",encyptedString);
    }
    
    - (void)viewDidLoad {
        [super viewDidLoad];
        
        self.view.backgroundColor = [UIColor whiteColor];
    }
    
    - (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
        [self encyptString:@"12345"];
    }
    
    @end
    

    ”ABCDEF“异或0xAB之后,再依次取出来异或0xAB还原字符串“ABCDEF”(A异或B等于C,C再异或B等于A)。编译的时候会直接把异或的结果编译出来,编译后的函数体是没有“ABCDEF”字符的。

    通过Hopper再次查看MachO文件,发现已经不能找到明文字符串。


    截屏2020-11-02下午9.17.14.png

    相关文章

      网友评论

        本文标题:《iOS防护07》字符串加密

        本文链接:https://www.haomeiwen.com/subject/ganmvktx.html