2012-07-15 17 views
7

W mojej aplikacji chcę móc zsynchronizować konfigurację, która zostanie utworzona przez użytkownika. Chciałem użyć iCloud, aby zsynchronizować tę konfigurację, tak aby zawsze była taka sama na wszystkich urządzeniach. Ale używam pęku kluczy do przechowywania hasła.Klucz synchronizacji iCloud

Czy istnieje sposób na synchronizację danych pęku kluczy?

Odpowiedz

3

Nie, synchronizacja z użyciem pęku kluczy nie jest częścią iCloud. Było to częścią synchronizacji dot mac, ale nie jest już dostępne.

Prawdopodobnie pojawi się informacja, czy jest to dobry pomysł, czy nie (automatyczne przenoszenie haseł z jednego urządzenia do drugiego), szczególnie w sytuacji, gdy wiele osób udostępnia konto iCloud (prawdopodobnie, ale nie jest ono gwarantowane w tych dniach).

Jeśli uważasz, że przechowywanie hasła na pęku kluczy urządzenia (i tym samym wymaga, aby użytkownik wprowadzał je co najmniej raz na urządzenie), musisz podać własne szyfrowanie i bezpieczeństwo oraz przechowywać dane bezpośrednio w iCloud, tak jak w magazynie kluczy.

16

iCloud Keychain to nowa funkcja w iOS 7.0.3 i OS X Mavericks 10.9. Atrybut kSecAttrSynchronizable służy do dodawania elementu pęku kluczy przy użyciu interfejsu SecItem API.

+0

#jrc Czy możesz mi pomóc ustawić atrybut kSecAttrSynchronizable w pęku kluczy. – iKT

2

Oto metody użytkowe, które zrobiłem dla pęku kluczy. kSecAttrSynchronizowalna jest tym, co sprawia, że ​​iCloud Sync działa. Mam nadzieję, że oni pomagają.

  • Kwerenda pęku kluczy.
  • usuń
  • Delete poz
  • Zapisz element
  • poz obciążenia

    + (NSMutableDictionary *)getKeychainQuery:(NSString *)service { 
        return [NSMutableDictionary dictionaryWithObjectsAndKeys: 
          (__bridge id)kSecClassGenericPassword, (__bridge id)kSecClass, 
          service, (__bridge id)kSecAttrService, 
          service, (__bridge id)kSecAttrAccount, 
          service, (__bridge id)kSecAttrSynchronizable, 
          (__bridge id)kSecAttrAccessibleAfterFirstUnlock, (__bridge id)kSecAttrAccessible, 
          nil]; 
    } 
    
    + (void)save:(NSString *)service data:(id)data { 
        NSMutableDictionary *keychainQuery = [self getKeychainQuery:service]; 
        SecItemDelete((__bridge CFDictionaryRef)keychainQuery); 
        [keychainQuery setObject:[NSKeyedArchiver archivedDataWithRootObject:data] forKey:(__bridge id)kSecValueData]; 
        SecItemAdd((__bridge CFDictionaryRef)keychainQuery, NULL); 
    } 
    
    + (void)remove:(NSString *)service { 
        NSMutableDictionary *keychainQuery = [self getKeychainQuery:service]; 
        SecItemDelete((__bridge CFDictionaryRef)keychainQuery); 
    } 
    
    +(NSString *)keychainItem:(NSString *)service{ 
        id data = [self load:service]; 
    
        if([data isKindOfClass:[NSString class]]){ 
         return data; 
        } 
        return @""; 
    } 
    
    + (id)load:(NSString *)service { 
        id ret = nil; 
        NSMutableDictionary *keychainQuery = [self getKeychainQuery:service]; 
        [keychainQuery setObject:(id)kCFBooleanTrue forKey:(__bridge id)kSecReturnData]; 
        [keychainQuery setObject:(__bridge id)kSecMatchLimitOne forKey:(__bridge id)kSecMatchLimit]; 
        CFDataRef keyData = NULL; 
        if (SecItemCopyMatching((__bridge CFDictionaryRef)keychainQuery, (CFTypeRef *)&keyData) == noErr) { 
         @try { 
          ret = [NSKeyedUnarchiver unarchiveObjectWithData:(__bridge NSData *)keyData]; 
         } 
         @catch (NSException *e) { 
          NSLog(@"Unarchive of %@ failed: %@", service, e); 
         } 
         @finally {} 
        } 
        if (keyData) CFRelease(keyData); 
        return ret; 
    } 
    
+0

+1 dla pełnej odpowiedzi, a kod zapewniający wszystko jest potrzebny do archiwizacji danych. Oczywiście obiekt danych (id) musi być zgodny z protokołem . – loretoparisi

Powiązane problemy