项目中经常要用到一些重要的字符串,本文主要介绍如何对对称加密中的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
网友评论