我需要在NSString
對象中存儲密碼;然而,我想要某種方式來混淆它們,所以它們不能直接從內存中讀取。在NSString中存儲密碼而不能在內存中讀取
這是一個Mac OS X(10.5)應用程序,但是一個也適用於iPhone的解決方案將非常感謝。
我需要在NSString
對象中存儲密碼;然而,我想要某種方式來混淆它們,所以它們不能直接從內存中讀取。在NSString中存儲密碼而不能在內存中讀取
這是一個Mac OS X(10.5)應用程序,但是一個也適用於iPhone的解決方案將非常感謝。
如果您使用鑰匙串存儲密碼,那麼您可以不用傳遞字符串來處理不透明鑰匙串SecKeychainItemRefs
,只需要在需要的地方檢索明文。這也是Mac用戶期望他們的密碼被處理的方式。不幸的是,不知道你爲什麼「需要在NSString
對象中存儲密碼」,我不知道這是真的:-)
在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上有很多相同的代碼版本。
A的用於存儲和檢索密碼和鑰匙串碼組非常有用的可以在這裏找到:
http://log.scifihifi.com/post/55837387/simple-iphone-keychain-code
我用它,和它的工作好。
我認爲海報是指在內存中混淆密碼,所以你不能只讀內存中的伊娃內容。來自谷歌的GData庫有一些有用的代碼,用於將實例變量中存儲爲NSMutableData的密碼異或。
// 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客戶端,您可能在保留密碼數據引用的應用程序中擁有長期服務/管理器對象,我認爲這是一種合理的方法。
爲什麼你特別需要將它們存儲在一個字符串中,爲什麼有人試圖獲取該內存? – 2009-04-15 07:59:29