2013-09-05 65 views
2

如何在iOS中通过硬编码来锁定SSL证书(DER格式)?iOS中的证书锁定

例如,目前可以使用的东西,如下列:

NSData *mydata = [NSData dataWithContentsOfURL:[[NSBundle mainBundle] 
        URLForResource:@"mycert" withExtension:@"cer"]]; 

然后拿到证书byteslengthNSData提供的方法。

是否可以将它存储为char数组?

我问这个问题,因为如果你将证书文件存储在捆绑包中,那么任何人都可以将其换成另一个证书。

回答

3

这是可能的。做到这一点的一种方法是暂时导入证书为你做:

NSData *mydata = [NSData dataWithContentsOfURL:[[NSBundle mainBundle] URLForResource:@"mycert" withExtension:@"cer"]]; 

那么只需登录了这一点,因为这样:

NSLog(@"%@",myData); 

这将输出一些长字符串由<和封闭式>符号。 NSData对象的

输出示例:

<6j5434 34j320 29dmr4 dj28d8 6j5434 34j320 29dmr4 dj28d8 6j5434 34j320 29dmr4 dj28d8 
6j5434 34j320 29dmr4 dj28d8 6j5434 34j320 29dmr4 dj28d8 6j5434 34j320 29dmr4 dj28d8 
6j5434 34j320 29dmr4 dj28d8 6j5434 34j320 29dmr4 dj28d8 6j5434 34j320 29dmr4 dj28d8 
6j5434 34j320 29dmr4 dj28d8 6j5434 34j320 29dmr4 dj28d8 6j5434 34j320 29dmr4 dj28d8 
6j5434 34j320 29dmr4 dj28d8 6j5434 34j320 29dmr4 dj28d8 6j5434 34j320 29dmr4 dj28d8 
6j5434 34j320 29dmr4 dj28d8 6j5434 34j320 29dmr4 dj28d8 6j5434 34j320 29dmr4 dj28d8 
6j5434 34j320 29dmr4 dj28d8 6j5434 34j320 29dmr4 dj28d8 6j5434 34j320 29dmr4 dj28d8> 

拷贝输出和硬编码到.m文件的顶部之一。这样它将被编译成非人类可读的代码。

这里是实现这个办法:

#define CERT_DATA @"<6j5434 34j320 29dmr4 dj28d8 6j5434 34j320 29dmr4 dj28d8 6j5434 34j320 29dmr4 dj28d8 
    6j5434 34j320 29dmr4 dj28d8 6j5434 34j320 29dmr4 dj28d8 6j5434 34j320 29dmr4 dj28d8 
    6j5434 34j320 29dmr4 dj28d8 6j5434 34j320 29dmr4 dj28d8 6j5434 34j320 29dmr4 dj28d8 
    6j5434 34j320 29dmr4 dj28d8 6j5434 34j320 29dmr4 dj28d8 6j5434 34j320 29dmr4 dj28d8 
    6j5434 34j320 29dmr4 dj28d8 6j5434 34j320 29dmr4 dj28d8 6j5434 34j320 29dmr4 dj28d8 
    6j5434 34j320 29dmr4 dj28d8 6j5434 34j320 29dmr4 dj28d8 6j5434 34j320 29dmr4 dj28d8 
    6j5434 34j320 29dmr4 dj28d8 6j5434 34j320 29dmr4 dj28d8 6j5434 34j320 29dmr4 dj28d8>" 

下一段的关键是使得这种方法的工作。您必须将NSData的字符串表示形式转换回NSData

这里是一个会做正是一个方法:

-(void)yourMethodThatNeedsCertData 
{ 
    NSData *certData = [self dataFromHexString:[[[CERT_DATA stringByReplacingOccurrencesOfString:@"<" withString:@""]stringByReplacingOccurrencesOfString:@">" withString:@""] stringByReplacingOccurrencesOfString:@" " withString:@""]]; 
} 

- (NSData *)dataFromHexString:(NSString *)string 
{ 
    // Converts the NSData string representation back into NSData object 
    const char *chars = [string UTF8String]; 
    int i = 0, len = string.length; 

    NSMutableData *data = [NSMutableData dataWithCapacity:len/2]; 
    char byteChars[3] = {'\0','\0','\0'}; 
    unsigned long wholeByte; 

    while (i < len) 
    { 
     byteChars[0] = chars[i++]; 
     byteChars[1] = chars[i++]; 
     wholeByte = strtoul(byteChars, NULL, 16); 
     [data appendBytes:&wholeByte length:1]; 
    } 
    return data; 
} 

请注意,您通过删除所有的空格和“<“>”字符必须“干净” NSData的字符串CERT_DATA。祝你好运,我希望这有助于!

+0

“通过这种方式,即使是在那里最好的监狱破坏者,它也会被编辑和隐藏”。当设备越狱时,无论如何它都是安全游戏。在代码中将您的证书作为字符串表示形式很容易找到并替换任何体面的逆向工程工具。 – Toad