2013-10-18 31 views
0

刪除的NSString我有一個NSString(含有一些機密數據)從存儲器但不僅通過將其設置到nil除去,而是通過抵消它的字節。什麼到目前爲止,我已經試過是:從存儲器

NSString *str = @"test"; 
NSLog(@"original string:%@", str); 
CFStringRef ref = (__bridge CFStringRef)str; 
const char * strPtr = CFStringGetCStringPtr(ref, kCFStringEncodingUTF8); 
memset(strPtr, 0, [str lengthOfBytesUsingEncoding:NSUTF8StringEncoding]); 
NSLog(@"cleared string:%@", str); 

CFStringGetCStringPtr將返回NULL的功能,所以它崩潰在與memset行。蘋果說here,在某些情況下,該功能返回NULL是正常的,但我不知道如何解決這個問題。

在此先感謝

+1

爲什麼不釋放指針之前,只需要改變字符串的內容? – Alexander

+0

這是不變的,所以我所能做的是改變'str'指向一個不同的對象,但我可能只是單純的將其設置爲'nil'這是不夠的 – Levi

+2

這種企圖隱藏敏感數據是徒勞的。即使您設法清除內存,攻擊者也可以在清除內存之前獲取內存。國際海事組織(IMO)目前沒有辦法阻止從內存獲取信息,或者利用其他技巧獲取機密信息,假設設備遭到破解。 – CouchDeveloper

回答

3

信心數據不存儲爲字符串。你不能輕易地將它們從內存中刪除。

如果可能的話,使用NSMutableData存儲信心數據,來代替。

+0

如果是由用戶輸入的密碼怎麼辦?我應該將它轉換爲NSData並將其保存在內存中嗎? – Levi

+0

謝謝,我想我會這樣做,然後 – Levi

+0

一個字符數組也可以,只是不要使用字符串。他們是危險的,他們可以很容易在記憶中找到。 – Sulthan

-1

我已經試過這樣的事情如下: -

NSMutableString *str = @"test"; 
NSLog(@"original string:%@", str); 
CFStringRef ref = (__bridge CFStringRef)str;//kCFStringEncodingUTF16 
const char * strPtr = CFStringGetCStringPtr(ref, kCFStringEncodingUTF16); 
NSUInteger memorySize=[str lengthOfBytesUsingEncoding:NSUTF8StringEncoding]; 
NSLog(@"cleared string:%d", memorySize); 


Output := 4 
+0

好的,爲什麼這會幫助我?你對原始字符串什麼都不做。 – Levi

+0

這段代碼只是沒有崩潰,除了這個你想實現嗎? –

+0

我知道這不是崩潰。再次閱讀問題。它在'memset'行崩潰,它不會出現在你的代碼中。 – Levi

0

試試這個:

NSMutableString *str = [NSMutableString stringWithString:@"test"]; 

    NSLog(@"original string:%@", str); 

    CFStringRef ref = (CFStringRef)str; 

    CFIndex stringLength = CFStringGetLength(ref), usedBytes = 0L; 

    const char * strPtr = NULL; 

    strPtr = CFStringGetCStringPtr(ref, kCFStringEncodingUTF8); 

    char *freeUTF8StringPtr = NULL; 

    for(CFIndex idx = 0L; (strPtr != NULL) && (strPtr[idx] != 0); idx++) 
    { 
     if(strPtr[idx] >= 128) { strPtr = NULL; } 
    } 

    if((strPtr == NULL) && ((freeUTF8StringPtr = malloc(stringLength + 1L)) != NULL)) 
    { 

    CFStringGetBytes(ref, CFRangeMake(0L, stringLength), kCFStringEncodingUTF8, '?', false, (UInt8*)freeUTF8StringPtr, stringLength, &usedBytes); 
     freeUTF8StringPtr[usedBytes] = 0; 
     strPtr = (const char *)freeUTF8StringPtr; 

    } 

    NSUInteger memorySize=[str lengthOfBytesUsingEncoding:NSUTF8StringEncoding]; 

    NSLog(@"cleared string:%@", str); 
+0

感謝您的回答,但我的字符串是不可變的。使用可變字符串我寫的代碼不會崩潰。所以我想這是主要問題 – Levi