ver que otro mac llavero las ingresa guardadas desde cómo cuentas contraseñas codigo aprobar apple ios objective-c keychain private-key

que - Agregando clave privada en llavero iOS



llavero icloud ver contraseñas (2)

El siguiente código funcionó para mí:

NSMutableDictionary *query = [[NSMutableDictionary alloc] init]; [query setObject:(id)kSecClassKey forKey:(id)kSecClass]; [query setObject:(id)kSecAttrAccessibleWhenUnlocked forKey:(id)kSecAttrAccessible]; [query setObject:[NSNumber numberWithBool:YES] forKey:(id)kSecReturnData]; //adding access key [query setObject:(id)key forKey:(id)kSecAttrApplicationTag]; //removing item if it exists SecItemDelete((CFDictionaryRef)query); //setting data (private key) [query setObject:(id)data forKey:(id)kSecValueData]; CFTypeRef persistKey; OSStatus status = SecItemAdd((CFDictionaryRef)query, &persistKey); if(status) { NSLog(@"Keychain error occured: %ld (statuscode)", status); return NO; }

Estoy tratando de agregar una clave privada en el llavero de iOS. El certificado (clave pública) funciona bien, pero la clave privada se niega ... Estoy totalmente confundido por qué el siguiente código no funciona.

Primero estoy comprobando si la clave actual (= clave en el caso de que el Llavero sea un almacén de clave / valor) está ''libre'' en el Llavero. Luego voy a agregar la clave privada.

CFStringRef labelstring = CFStringCreateWithCString(NULL, [key cStringUsingEncoding:NSUTF8StringEncoding], kCFStringEncodingUTF8); NSArray* keys = [NSArray arrayWithObjects:(__bridge id)kSecClass,kSecAttrLabel,kSecReturnData,kSecAttrAccessible,nil]; NSArray* values = [NSArray arrayWithObjects:(__bridge id)kSecClassKey,labelstring,kCFBooleanTrue,kSecAttrAccessibleWhenUnlocked,nil]; NSMutableDictionary* searchdict = [NSMutableDictionary dictionaryWithObjects:values forKeys:keys]; CFRelease(labelstring); NSMutableDictionary *query = searchdict; CFTypeRef item = NULL; OSStatus error = SecItemCopyMatching((__bridge_retained CFDictionaryRef) query, &item); if (error) { NSLog(@"Error: %ld (statuscode)", error); } if(error != errSecItemNotFound) { SecItemDelete((__bridge_retained CFDictionaryRef) query); } [query setObject:(id)data forKey:(__bridge id)kSecValueData]; OSStatus status = SecItemAdd((__bridge_retained CFDictionaryRef) query, &item); if(status) { NSLog(@"Keychain error occured: %ld (statuscode)", status); return NO; }

La salida de depuración es la siguiente:

2012-07-26 15:33:03.772 App[15529:1b03] Error: -25300 (statuscode) 2012-07-26 15:33:11.195 App[15529:1b03] Keychain error occured: -25299 (statuscode)

El primer código de error -25300 representa errSecItemNotFound . Así que no hay valor almacenado para esta clave. Luego, cuando intento agregar la clave privada en el Llavero, obtengo -25299 que significa errSecDuplicateItem . No entiendo esto. ¿Por qué está pasando esto?

¿Alguien tiene una pista o pista en esto?

Códigos de error de Apple:

errSecSuccess = 0, /* No error. */ errSecUnimplemented = -4, /* Function or operation not implemented. */ errSecParam = -50, /* One or more parameters passed to a function where not valid. */ errSecAllocate = -108, /* Failed to allocate memory. */ errSecNotAvailable = -25291, /* No keychain is available. You may need to restart your computer. */ errSecDuplicateItem = -25299, /* The specified item already exists in the keychain. */ errSecItemNotFound = -25300, /* The specified item could not be found in the keychain. */ errSecInteractionNotAllowed = -25308, /* User interaction is not allowed. */ errSecDecode = -26275, /* Unable to decode the provided data. */ errSecAuthFailed = -25293, /* The user name or passphrase you entered is not correct. */

¡Gracias por adelantado!

Actualización # 1: he descubierto que solo funciona por primera vez. Incluso cuando los datos y la clave son diferentes, después de la primera vez que se almacenan en el llavero no puedo almacenar más claves.


Lo siento pero nunca podré depurar tu código. Apple proporciona un código de muestra (KeychainItemWrapper) que te permite guardar una cadena (recuerdo). Es una gran ayuda tratar con el llavero. Hay una esencia en la web que es una versión modificada de esa clase, pero guarda y restaura un diccionario (archivado como un objeto de datos, que es lo que el código de Apple hace con la cadena). Esto le permite guardar varios elementos en una interfaz al llavero. La esencia está aquí Llavero para NSDictionary / data