对称/非对称 ,哈希 (和加密算法息息相关的)
对称加密: 明文的数据,调用对称加密算法(给它一个key),把其加密成密文
解密 : 通过密文,调用对称加密算法,和key,进行解密获取明文。
所以:黑客一旦拿到这个key就会把所有的加密信息解密出来。(分析:一般会加字符串断点寻找CCCrypt,查找是哪个函数调用的)
明文的加密方法
NSString * str = [[EncryptionToolsClass sharedEncryptionTools]
encryptString:@"some message want to encrypted" keyString:AES_KEYINFO() iv:nil];
常量信息如何加密和保护
方式1
弊端:反汇编进入到AES_KEY方法还是能看到
方式2
#import "EncryptionTools.h"
//NSString * const AES_KEY = @"IU@*(!@UEI!@()*";
#define STRING_ENCRYPT_KEY 0xAC
static NSString * AES_KEYINFO(){
/*
采用这样的方式,这些字符不会进入字符常量区.
编译器直接换算成异或结果,编译器不会把它当成常量去做了所以不会进入常量区。
*/
unsigned char key[]={
(STRING_ENCRYPT_KEY ^ 'I'),
(STRING_ENCRYPT_KEY ^ 'U'),
(STRING_ENCRYPT_KEY ^ '@'),
(STRING_ENCRYPT_KEY ^ '*'),
(STRING_ENCRYPT_KEY ^ '('),
(STRING_ENCRYPT_KEY ^ '!'),
(STRING_ENCRYPT_KEY ^ '@'),
(STRING_ENCRYPT_KEY ^ 'U'),
(STRING_ENCRYPT_KEY ^ '\0')
};
unsigned char * p = key;
/*下面这段代码是将这个字符串通过异或的方式解出来,
相当于123456+1-1,最后还是这个字符串,这部是减一的操作。目的是不让字符串进入常量区
*/
while (((*p) ^= STRING_ENCRYPT_KEY) != '\0') p++;
return [NSString stringWithUTF8String:(const char *)key];
}
使用方式2,不需要使用方式1,因为方式2在反编译中看不到,只有通过这个方法的返回值才能看到,不过这个方法到时候也会被裁掉,增加了黑客的破解难度
调用进行异或操作后,加密过后的Key AES_KEYINFO()
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
UserInfoClass * user = [[UserInfoClass alloc] init];
if ([user isVipWithAccount:@"hank"]) {
NSLog(@"%@",AES_KEYINFO());
NSString * str = [[EncryptionToolsClass sharedEncryptionTools] encryptString:@"some message want to encrypted" keyString:AES_KEYINFO() iv:nil];
[user sendWithUserInfo:str];
NSLog(@"是VIP!");
}else{
NSLog(@"不是VIP !");
}
}