2009-04-14 27 views
7

我需要在NSString對象中存儲密碼;然而,我想要某種方式來混淆它們,所以它們不能直接從內存中讀取。在NSString中存儲密碼而不能在內存中讀取

這是一個Mac OS X(10.5)應用程序,但是一個也適用於iPhone的解決方案將非常感謝。

+0

爲什麼你特別需要將它們存儲在一個字符串中,爲什麼有人試圖獲取該內存? – 2009-04-15 07:59:29

回答

12

如果您使用鑰匙串存儲密碼,那麼您可以不用傳遞字符串來處理不透明鑰匙串SecKeychainItemRefs,只需要在需要的地方檢索明文。這也是Mac用戶期望他們的密碼被處理的方式。不幸的是,不知道你爲什麼「需要在NSString對象中存儲密碼」,我不知道這是真的:-)

3

在把它們放入NSString之前,難道你不能把它們放入md5嗎?那麼當你去測試時,md5是輸入字符串,並將其與存儲的內容進行比較?

+0

這不會阻止任何人閱讀它們。 – Chuck 2009-04-15 02:04:03

+0

是的。但是,您將無法使用md5字符串進行身份驗證或使用任何密碼。 – Ronald 2009-04-15 02:06:36

+0

它會阻止他們讀取密碼,但允許訪問不同的散列。 – 2009-04-15 07:17:25

3

在iPhone上,沙箱將阻止任何人訪問您的密碼。在桌面上並不那麼容易。

您應該將密碼存儲爲散列而不是明文。我相信這會在不影響功能的情況下爲您提供所需的結果。你永遠無法做的唯一的事情就是再次訪問明文密碼 - 如果你想分析它的實力或將它傳遞給另一項服務。一般來說,哈希不會犧牲功能。

以下代碼在rawPassword中獲取密碼並將其SHA-1散列存儲在passwordHash中。

#import <CommonCrypto/CommonDigest.h> 

const char* utf8PasswordRepresentation = [rawPassword UTF8String]; 
unsigned char * rawHash = malloc(CC_SHA1_DIGEST_LENGTH); 

CC_SHA1(utf8PasswordRepresentation, strlen(utf8PasswordRepresentation), rawHash); 

NSMutableString* passwordHash = [NSMutableString CC_SHA1_DIGEST_LENGTH*2]; 
for (int i = 0 ; i< CC_SHA1_DIGEST_LENGTH; i++) 
    [passwordHash appendFormat:@"%02x" , rawHash[i]]; 

請注意,這裏沒有內存管理。

查看維基百科條目explanation of password hashing

intertubes上有很多相同的代碼版本。

2

我認爲海報是指在內存中混淆密碼,所以你不能只讀內存中的伊娃內容。來自谷歌的GData庫有一些有用的代碼,用於將實例變量中存儲爲NSMutableData的密碼異或。

source for GDataServiceBase.m

// XorPlainMutableData is a simple way to keep passwords held in heap objects 
// from being visible as plain-text 
static void XorPlainMutableData(NSMutableData *mutable) { 

    // this helps avoid storing passwords on the heap in plaintext 
    const unsigned char theXORValue = 0x95; // 0x95 = 0xb10010101 

    unsigned char *dataPtr = [mutable mutableBytes]; 
    NSUInteger length = [mutable length]; 

    for (NSUInteger idx = 0; idx < length; idx++) { 
     dataPtr[idx] ^= theXORValue; 
    } 
} 

您可以保存/使用XOR恢復密碼(請參閱#password口令和#setUserCredentialsWithUsername:密碼:在同一個文件的方法)。異或並不是高科技加密技術,但它足以阻止偶然的窺探。對於GData客戶端,您可能在保留密碼數據引用的應用程序中擁有長期服務/管理器對象,我認爲這是一種合理的方法。

相關問題