0

我必须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. 苹果在这里说,在某些情况下,该函数返回是正常的NULL,但我不知道如何解决这个问题。

提前致谢

4

3 回答 3

3

不要将可靠的数据存储为字符串。您无法轻松地将它们从内存中删除。

如果可能,请改用NSMutableData存储可信数据。

于 2013-10-18T11:18:37.017 回答
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);
于 2013-10-18T11:09:30.877 回答
-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
于 2013-10-18T11:05:38.993 回答