2011-08-22 23 views
21

Uygulamamın anahtarlığını sıfırlamanın bir yolu olup olmadığını öğrenmek istiyorum. Hiçbir şey Bir iPhone Uygulamasının Anahtarlıkını Sıfırla

[NSUserDefaults resetStandardUserDefaults]

gibi anahtarlıkta için var olup olmadığını merak ediyorum. Uygulama silindikten sonra bile anahtarlık sıfırlanmaz. Şimdiye kadar bildiğim tek yolu, onları uygulamadan tek tek sıfırlamak.

+0

@ serge-k, bu soru 2012 yılında bu sırada 2011 yılında soruldu. –

+0

Doğru, sadece burada bulunan diğer cevabı buldum http://stackoverflow.com/questions/14086085/how-to-delete-all -keychain-ürün-erişilebilir-to-bir-app daha güncel bir çözümdür. Bir bağlantı olarak bırakabilirim, yinelenen bayrağı kaldırdım. –

cevap

52

şimdiye kadar sen ben uygulaması için TÜM mevcut anahtarları siler aşağıdaki çözümü sunmak istiyorum

-(void)resetKeychain { 
    [self deleteAllKeysForSecClass:kSecClassGenericPassword]; 
    [self deleteAllKeysForSecClass:kSecClassInternetPassword]; 
    [self deleteAllKeysForSecClass:kSecClassCertificate]; 
    [self deleteAllKeysForSecClass:kSecClassKey]; 
    [self deleteAllKeysForSecClass:kSecClassIdentity]; 
} 

-(void)deleteAllKeysForSecClass:(CFTypeRef)secClass { 
    NSMutableDictionary* dict = [NSMutableDictionary dictionary]; 
    [dict setObject:(__bridge id)secClass forKey:(__bridge id)kSecClass]; 
    OSStatus result = SecItemDelete((__bridge CFDictionaryRef) dict); 
    NSAssert(result == noErr || result == errSecItemNotFound, @"Error deleting keychain data (%ld)", result); 
} 
(sadece iOS) silmek istediğiniz tanımlayıcıları biliyorum dayanır

Swift 2.2 sürümü:

func resetKeychain() { 
    self.deleteAllKeysForSecClass(kSecClassGenericPassword) 
    self.deleteAllKeysForSecClass(kSecClassInternetPassword) 
    self.deleteAllKeysForSecClass(kSecClassCertificate) 
    self.deleteAllKeysForSecClass(kSecClassKey) 
    self.deleteAllKeysForSecClass(kSecClassIdentity) 
} 

func deleteAllKeysForSecClass(secClass: CFTypeRef) { 
    let dict: [NSString : AnyObject] = [kSecClass : secClass] 
    let result = SecItemDelete(dict) 
    assert(result == noErr || result == errSecItemNotFound, "Error deleting keychain data (\(result))") 
} 

Swift 3 versiyonu

Vegard çözümü @ ait
func resetKeychain() { 
    deleteAllKeysForSecClass(kSecClassGenericPassword) 
    deleteAllKeysForSecClass(kSecClassInternetPassword) 
    deleteAllKeysForSecClass(kSecClassCertificate) 
    deleteAllKeysForSecClass(kSecClassKey) 
    deleteAllKeysForSecClass(kSecClassIdentity) 
} 

func deleteAllKeysForSecClass(_ secClass: CFTypeRef) { 
    let dict: [NSString : Any] = [kSecClass : secClass] 
    let result = SecItemDelete(dict as CFDictionary) 
    assert(result == noErr || result == errSecItemNotFound, "Error deleting keychain data (\(result))") 
} 
+4

Telefonun kendisini kullanarak tüm anahtar zincirlerini manuel olarak silmek için bir yol var mı? Talimatlar gibi bir şey [burada] (http://www.imore.com/how-access-and-view-your-icloud-keychain-passwords-ios-7) – abbood

+2

@abbood programatik olarak bu imkansız olmalıdır. Niye ya? Uygulamanız korumalı olduğundan ve diğer uygulamalardan ** hiçbir zaman anahtar kelime öğelerini silmeniz mümkün değildir **. Tek tahmin edeceğim * olası senaryo, simülatörün kendisini kullanmaktır iOS iOS Simulator -> İçeriği Sıfırla ve Ayarlar 0 – Honey

-5
- (void)resetKeychainItem 
{ 
    OSStatus junk = noErr; 
    if (!keychainItemData) { 
     self.keychainItemData = [[NSMutableDictionary alloc] init]; 
    } else if (keychainItemData){ 
     NSMutableDictionary *tempDictionary = [self dictionaryToSecItemFormat:keychainItemData]; 
     junk = SecItemDelete((CFDictionaryRef)tempDictionary); 
     if (junk != noErr) { 
      UIAlertView *dialog = [[UIAlertView alloc] initWithTitle:@"Keychain Error" message:[NSString stringWithFormat:@"A problem with updating the secure Keychain items with this information (likely, this email address information is duplicated in another Player). Error code: %d %@", junk, [self resultText:-junk]] delegate:self cancelButtonTitle:NSLocalizedStringFromTable(@"Ok", @"Localizable", @"display text") otherButtonTitles:nil]; 
      [dialog show]; 
      [dialog release]; 
      //NSAssert(junk == noErr || junk == errSecItemNotFound, @"Problem deleting current dictionary."); 
      return; 
     } 
    } 

    // Default attributes for keychain item. 
    [keychainItemData setObject:@"" forKey:(id)kSecAttrAccount]; 
    [keychainItemData setObject:@"" forKey:(id)kSecValueData]; 
    [keychainItemData setObject:@"" forKey:(id)kSecAttrLabel]; 
    [keychainItemData setObject:@"" forKey:(id)kSecAttrDescription]; 
    [keychainItemData setObject:@"" forKey:(id)kSecAttrComment]; 
    // Default data for keychain item. 
    [keychainItemData setObject:@"" forKey:(id)kSecAttrModificationDate]; 
    [keychainItemData setObject:@"" forKey:(id)kSecAttrService]; 


} 
+0

Kullanıcıların, kodunuzun ne yaptığını anlamasına yardımcı olacak bazı yorumlar ekleyebilir misiniz –

+0

@JimP, biraz açıklama verebilir misiniz? Hala sıfırlamak için tüm anahtarları sağlamanız gerekiyor mu? Çok fazla güvenlik bilgim var ve hepsini sıfırlamak istiyorum. –

+4

Ne berbat bir cevap ... – Chris

11
KeychainItemWrapper *keychainItem = [[KeychainItemWrapper alloc] initWithIdentifier:@"nameOfYourKeychain" accessGroup:nil]; 

[keychainItem resetKeychainItem]; 

Çok basit :)

Düzenleme: bir soruya yanıt olarak aşağıda sorulan - KeychainItemWrapper nedir?

burada bulman indirebilirsiniz Apple tarafından yazılmış bir sınıf var: Bunu kullanmak istediğiniz yeri http://developer.apple.com/library/ios/#samplecode/GenericKeychain/Listings/Classes_KeychainItemWrapper_m.html

içe sonra projenize ekleyin ve. Ardından, yukarıda sağlanan kod snippet'ini kullanın. cevapların hepsi itibariyle

+2

Merhaba, KeychainItemWrapper nedir? – hzxu

+0

@hzxu cevabı güncelledi, teşekkürler. – jcrowson

+1

Teşekkürler, ancak birkaç anahtar/değer çiftine ihtiyacım varsa ve tüm öğelerim için bir sözlük kullanamıyorum ve standart kite karşı "kSecValueData" gibi saklayamam çünkü değer bir dize olmalı, o zaman anahtar-değer çiftlerimin sayısı olarak birçok '' KeychainItemWrapper'? – hzxu

2

Blok tabanlı sürümü: sadece yardımcı yöntemler var kalmadan kod düşmesi gibi bizler için

void (^deleteAllKeysForSecClass)(CFTypeRef) = ^(CFTypeRef secClass) { 
    id dict = @{(__bridge id)kSecClass: (__bridge id)secClass}; 
    OSStatus result = SecItemDelete((__bridge CFDictionaryRef) dict); 
    NSAssert(result == noErr || result == errSecItemNotFound, @"Error deleting keychain data (%d)", (int)result); 
}; 
deleteAllKeysForSecClass(kSecClassGenericPassword); 
deleteAllKeysForSecClass(kSecClassInternetPassword); 
deleteAllKeysForSecClass(kSecClassCertificate); 
deleteAllKeysForSecClass(kSecClassKey); 
deleteAllKeysForSecClass(kSecClassIdentity); 

.

+0

Bunun için teşekkürler. Aynı zamanda en basit ve en etkileyici uygulama. –