2013-09-05 103 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