F85c7308e7f18a52a8d5ddf27f2e310d
安全攻与防篇:字符串加密

1.字符串加密

在前面的 《核心知识篇:密码学和加解密》,我们对哈希函数、对称加密、非对称加密都进行了学习。对称加密中,有一个关键的东西:Key。这个 Key 是一个字符串,下面我们来分析一下,怎么防止逆向工程师拿到 Key?

1.1 小示例

先编写我们的演示 Demo,代码比较简单,就是在 ViewController 类中添加一个对字符串进行对称加密的输出。

#import "GofEncryptionManager.h"

NSString * const GofEncryptKey = @"ABCDEFGHIJK";  // 加密的 Key

@implementation ViewController

- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
    NSString *str = [[GofEncryptionManager sharedEncryptionManager] gof_encryptString:@"我是待加密的字符串" keyString:GofEncryptKey iv:nil];
    NSLog(@"结果 : %@", str);
}

@end

代码编写完之后,我们编译,然后使用 Hopper 查看生成的可执行文件。

可以看到,我们加密的 Key,Hopper 自动就分析出来了,因为这是一个常量,可以直接从常量区拿到。对于逆向工程师来说,基本上不用花费时间,就可以得到我们加密的 Key。那么有什么方式来避免吗?

2. 改进

我们对上面的代码进行改进,不再使用字符串常量的方式来定义 Key。
```
static NSString * GofEncryptKey(){
unsigned char key[] = {
'A',
'B',
'C',
'D',
'E',
'F',
'G',
'H',
'I',
'J',
'K',
'\0'
};

return [NSString stringWithUTF8String:(const char *)key];

}

@implementation ViewController

  • (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    NSString *str = [[GofEncryptionManager sharedEncryptionManager] gof_encryptString:@"我是待加密的字符串" keyString:GofEncryptKey() iv:nil];
    // 结果 : JvqnbsFu6PHs+ZHrAU7grVvGSaxuFJzLulr18SOi7Qs=
top Created with Sketch.