Hoe verwijder je alle sleutelhanger-items die toegankelijk zijn voor een app?

Ik heb verdwaalde sleutelhangeritems op iOS (waarschijnlijk geschreven door een oude versie van de app) die ik moet verwijderen. Is er een gemakkelijke manier om dit te bereiken?


Antwoord 1, autoriteit 100%

Doe het voor alle lessen

Doelstelling-C:

NSArray *secItemClasses = @[(__bridge id)kSecClassGenericPassword,
                       (__bridge id)kSecClassInternetPassword,
                       (__bridge id)kSecClassCertificate,
                       (__bridge id)kSecClassKey,
                       (__bridge id)kSecClassIdentity];
for (id secItemClass in secItemClasses) {
    NSDictionary *spec = @{(__bridge id)kSecClass: secItemClass};
    SecItemDelete((__bridge CFDictionaryRef)spec);
}

Snel:

let secItemClasses = [kSecClassGenericPassword, kSecClassInternetPassword, kSecClassCertificate, kSecClassKey, kSecClassIdentity]
for itemClass in secItemClasses {
    let spec: NSDictionary = [kSecClass: itemClass]
    SecItemDelete(spec)
}

Antwoord 2, autoriteit 18%

Xamarin iOS-versie (MonoTouch) van geaccepteerd antwoordop Hoe verwijder je alle sleutelhanger-items die toegankelijk zijn voor een app staat hieronder:

foreach (var recordKind in new []{
                SecKind.GenericPassword,
                SecKind.Certificate,
                SecKind.Identity,
                SecKind.InternetPassword,
                SecKind.Key,
            })
    {
          SecRecord query = new SecRecord(recordKind);
          SecKeyChain.Remove(query);
    }

Als u er zeker van wilt zijn dat u de records inderdaad verwijdert, kunt u tijdens de ontwikkelinghet aantal items in KeyChain van een specifieke soort voor en na controleren met deze code:

SecStatusCode scc;
var records = SecKeyChain.QueryAsRecord(new SecRecord(SecKind.GenericPassword), 1000, out scc);

Antwoord 3, autoriteit 17%

Ik herschreef het antwoord van Daij-Djan in Swift:

let secItemClasses = [kSecClassGenericPassword,
    kSecClassInternetPassword,
    kSecClassCertificate,
    kSecClassKey,
    kSecClassIdentity]
for secItemClass in secItemClasses {
    let dictionary = [kSecClass as String:secItemClass]
    SecItemDelete(dictionary as CFDictionary)
}

Antwoord 4, autoriteit 11%

Snelle versie

import Foundation
import Security
public class Keychain: NSObject {
  public class func logout()  {
    let secItemClasses =  [
      kSecClassGenericPassword,
      kSecClassInternetPassword,
      kSecClassCertificate,
      kSecClassKey,
      kSecClassIdentity,
    ]
    for itemClass in secItemClasses {
      let spec: NSDictionary = [kSecClass: itemClass]
      SecItemDelete(spec)
    }
  }
}

gebruik:

Keychain.logout()

Antwoord 5, autoriteit 8%

Dankzij Daij-Djan ben ik tot deze oplossing gekomen:

for (id secclass in @[
     (__bridge id)kSecClassGenericPassword,
     (__bridge id)kSecClassInternetPassword,
     (__bridge id)kSecClassCertificate,
     (__bridge id)kSecClassKey,
     (__bridge id)kSecClassIdentity]) {
    NSMutableDictionary *query = [NSMutableDictionary dictionaryWithObjectsAndKeys:
                                  secclass, (__bridge id)kSecClass,
                                  nil];
    SecItemDelete((__bridge CFDictionaryRef)query);        
}

Antwoord 6

U kunt een kijkje nemen op de applicatie van Keychain Toegang gevonden in de map Hulpprogramma’s. Als u de toepassing start en klikt op “Alle items”, moet deze alle items weergeven die u hebt gemaakt met deze specifieke computer. De ontwikkelaar beginnen meestal met COM.


Antwoord 7

Helaas lijken alle antwoorden van deze vraag verouderd (sinds iOS 7.0+) omdat ze geen sleutelhanger-vermeldingen verwijderen die de kSecAttrSynchronizableflagset hebben (toestaan ​​synchronisatie aan andere apparaten via iCloud).

Om dergelijke vermeldingen te verwijderen, is het CRUCIBLE om een ​​vermelding toe te voegen aan de Verwijderingsquery Specificeren kSecAttrSynchronizable: kSecAttrSynchronizableAny:

let secItemClasses = [kSecClassGenericPassword,
    kSecClassInternetPassword,
    kSecClassCertificate,
    kSecClassKey,
    kSecClassIdentity]
for secItemClass in secItemClasses {
    let query: NSDictionary = [
        kSecClass as String: secItemClass,
        kSecAttrSynchronizable as String: kSecAttrSynchronizableAny
    ]
    SecItemDelete(query)
}

Other episodes