2012-07-18 25 views
6

Tôi muốn lưu id và mật khẩu của người dùng trong Ứng dụng.Cách sử dụng Keychain để lưu mật khẩu như mã mẫu GenericKeychain

Cách mã hóa được khuyến nghị là gì khi tôi lưu id và mật khẩu.

Tôi đang tìm cách an toàn hơn từ Jailbreak hoặc Hacker.

Mã mẫu GenericKeychain như thế nào?

http://developer.apple.com/library/ios/#samplecode/GenericKeychain/Introduction/Intro.html#//apple_ref/doc/uid/DTS40007797

tôi không thể có niềm tin về an toàn làm thế nào để sử dụng Keychain như GenericKeychain mẫu mã.

Vui lòng cho tôi biết một số lời khuyên. Cảm ơn bạn ^^ *

Trả lời

23

Bạn có thể sử dụng khuôn khổ an ninh

#import <Security/Security.h>

Để lưu một tên người dùng và mật khẩu cho một máy chủ:

-(void) saveUsername:(NSString*)user withPassword:(NSString*)pass forServer:(NSString*)server { 

    // Create dictionary of search parameters 
    NSDictionary* dict = [NSDictionary dictionaryWithObjectsAndKeys:(__bridge id)(kSecClassInternetPassword), kSecClass, server, kSecAttrServer, kCFBooleanTrue, kSecReturnAttributes, nil]; 

    // Remove any old values from the keychain 
    OSStatus err = SecItemDelete((__bridge CFDictionaryRef) dict); 

    // Create dictionary of parameters to add 
    NSData* passwordData = [pass dataUsingEncoding:NSUTF8StringEncoding]; 
    dict = [NSDictionary dictionaryWithObjectsAndKeys:(__bridge id)(kSecClassInternetPassword), kSecClass, server, kSecAttrServer, passwordData, kSecValueData, user, kSecAttrAccount, nil]; 

    // Try to save to keychain 
    err = SecItemAdd((__bridge CFDictionaryRef) dict, NULL); 

} 

Để loại bỏ:

-(void) removeAllCredentialsForServer:(NSString*)server { 

    // Create dictionary of search parameters 
    NSDictionary* dict = [NSDictionary dictionaryWithObjectsAndKeys:(__bridge id)(kSecClassInternetPassword), kSecClass, server, kSecAttrServer, kCFBooleanTrue, kSecReturnAttributes, kCFBooleanTrue, kSecReturnData, nil]; 

    // Remove any old values from the keychain 
    OSStatus err = SecItemDelete((__bridge CFDictionaryRef) dict); 

} 

Để đọc:

-(void) getCredentialsForServer:(NSString*)server { 

    // Create dictionary of search parameters 
    NSDictionary* dict = [NSDictionary dictionaryWithObjectsAndKeys:(__bridge id)(kSecClassInternetPassword), kSecClass, server, kSecAttrServer, kCFBooleanTrue, kSecReturnAttributes, kCFBooleanTrue, kSecReturnData, nil]; 

    // Look up server in the keychain 
    NSDictionary* found = nil; 
    CFDictionaryRef foundCF; 
    OSStatus err = SecItemCopyMatching((__bridge CFDictionaryRef) dict, (CFTypeRef*)&foundCF); 

    // Check if found 
    found = (__bridge NSDictionary*)(foundCF); 
    if (!found) 
     return; 

    // Found 
    NSString* user = (NSString*) [found objectForKey:(__bridge id)(kSecAttrAccount)]; 
    NSString* pass = [[NSString alloc] initWithData:[found objectForKey:(__bridge id)(kSecValueData)] encoding:NSUTF8StringEncoding]; 

} 
+1

Bây giờ bạn cần phải sử dụng __bridge (hãy fixups tự động làm điều đó cho bạn) để cast giữa mã ObjC và C ở trên. –

+0

Bạn có thể cập nhật điều này cho ARC được không. –

+0

Bạn cần kiểm tra err == errSecItemNotFound sau khi SecItemCopyMatching –

Các vấn đề liên quan