2011-05-31 12 views
18

Dado que mi aplicación estaría tratando con datos confidenciales del usuario, me gustaría saber si hay una manera de verificar desde mi aplicación si hay un bloqueo de contraseña configurado en iOS.Verificando programáticamente si se establece un código de bloqueo

La razón por la que necesito verificar esto es porque decir si el usuario tiene alguna información en la aplicación y luego la mantiene sobre la mesa y se apaga por un par de minutos. El iPad/iPhone por defecto, pasa al modo de espera. Si se hubiera establecido un código de acceso, solo cuando se ingrese el código correcto, ¿alguien podría usar el iPad? Esto proporcionaría una medida de seguridad adicional para evitar que cualquier transeúnte vea los datos confidenciales de la aplicación.

Básicamente, me gustaría que mi aplicación verifique si el bloqueo de contraseña está configurado y, si no, solicite al usuario que lo haga.

¿Esto es posible?

+0

no creo que es posible. ¿Por qué no agrega un mecanismo de bloqueo a su aplicación para que el usuario pueda bloquearla sin bloquear todo el iPad? – ughoavgfhw

+0

el caso que necesito sería cuando el usuario mantiene el ipad bajo y se va por un momento en una emergencia o algo ... en ese momento, el ipad se bloqueará automáticamente después de un tiempo (debido a su comportamiento predeterminado) ... para evitar que otra persona que no sea el usuario simplemente desbloquee el iPad y vea los datos confidenciales en la aplicación, necesitaba verificar si el bloqueo de código de acceso se configuró para el iPad y, de no ser así, solicitar al usuario que establezca un código de bloqueo. . – learner2010

Respuesta

3

Eche un vistazo a la sección Protección de archivos en The Application Runtime Environment. La protección de archivos requiere que el usuario tenga habilitada la configuración de bloqueo de código de acceso y un conjunto de código de acceso válido. Si su aplicación escribe/crea y archiva, use la opción NSDataWritingFileProtectionComplete. Si su aplicación no utiliza ningún archivo, cree un archivo ficticio y habilite la protección.

+1

¿Qué sucede si el bloqueo de código de acceso está deshabilitado? ¿Todavía puede realizar estos bloqueos de protección de archivos manualmente? Había visto el wwdc 2010 con respecto a la seguridad de los datos de las aplicaciones, pero se supone que tiene el bloqueo de código de acceso. ¿Cómo puedes hacer cumplir esto? – fes

+1

Esto ya no funciona. La lectura sugiere que no ha funcionado desde al menos iOS 5. – Simon

9

Con iOS 8, ahora hay una manera de verificar que el usuario tenga un conjunto de códigos de acceso. Este código se colgará en iOS 7.

Objective-C:

-(BOOL) deviceHasPasscode { 
    NSData* secret = [@"Device has passcode set?" dataUsingEncoding:NSUTF8StringEncoding]; 
    NSDictionary *attributes = @{ (__bridge id)kSecClass: (__bridge id)kSecClassGenericPassword, (__bridge id)kSecAttrService: @"LocalDeviceServices", (__bridge id)kSecAttrAccount: @"NoAccount", (__bridge id)kSecValueData: secret, (__bridge id)kSecAttrAccessible: (__bridge id)kSecAttrAccessibleWhenPasscodeSetThisDeviceOnly }; 

    OSStatus status = SecItemAdd((__bridge CFDictionaryRef)attributes, NULL); 
    if (status == errSecSuccess) { // item added okay, passcode has been set    
     SecItemDelete((__bridge CFDictionaryRef)attributes); 

     return true; 
    } 

    return false; 
} 

Swift:

func deviceHasPasscode() -> Bool { 
    let secret = "Device has passcode set?".dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false) 
    let attributes = [kSecClass as String:kSecClassGenericPassword, kSecAttrService as String:"LocalDeviceServices", kSecAttrAccount as String:"NoAccount", kSecValueData as String:secret!, kSecAttrAccessible as String:kSecAttrAccessibleWhenPasscodeSetThisDeviceOnly] 

    let status = SecItemAdd(attributes, nil) 
    if status == 0 { 
     SecItemDelete(attributes) 
     return true 
    } 

    return false 
} 
+0

¿está aprobado por Apple? – Nil

+1

Debería estar bien porque está utilizando llamadas estándar de llavero. –

2
solución

Xamarin.iOS para iOS 8 ... observo que llamo SecKeyChain.Remove(secRecord) en cada comprobar. He encontrado que si no incluyo este podría conseguir el dispositivo en un estado extraño donde estaba tratando de autenticar al usuario en cada llamada a SecKeyChain.Add(secRecord)

private bool DetectIfPasscodeIsSet() 
{ 
    var secRecord = new SecRecord (SecKind.GenericPassword) { 
     Label = "Check if passcode is set", 
     Description = "Check if passcode is set", 
     Account = "Check if passcode is set", 
     Service = "Check if passcode is set", 
     Comment = "Check if passcode is set", 
     ValueData = NSData.FromString ("Check if passcode is set"), 
     Generic = NSData.FromString ("Check if passcode is set") 
    }; 
    SecKeyChain.Remove (secRecord); 
    secRecord.AccessControl = new SecAccessControl (SecAccessible.WhenPasscodeSetThisDeviceOnly); 
    var status = SecKeyChain.Add (secRecord); 
    if (SecStatusCode.Success == status) { 
     SecKeyChain.Remove (secRecord); 
     return true; 
    } 
    return false; 
} 
+0

Gracias. ¡Necesitaba esto! – HansElsen

5

Desde iOS 9, hay una bandera en LAPolicyDeviceOwnerAuthentication marco LocalAuthentication .

+ (BOOL)isPasscodeEnabled 
{ 
    NSError *error = nil; 
    LAContext *context = [[LAContext alloc] init]; 

    BOOL passcodeEnabled = [context canEvaluatePolicy:LAPolicyDeviceOwnerAuthentication error:&error]; 

    if(passcodeEnabled) { 
     NSLog(@"Passcode enabled."); 
     return YES; 
    } 

    NSLog(@"Passcode NOT enabled: %@", error.localizedDescription); 
    return NO; 
} 

Desde iOS 8 ha habido otra bandera para comprobar si está habilitado TouchID:

+ (BOOL)isTouchIdEnabled 
{ 
    NSError *error = nil; 
    LAContext *context = [[LAContext alloc] init]; 

    BOOL touchIDEnabled = [context canEvaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics error:&error]; 

    if(touchIDEnabled) { 
     NSLog(@"TouchID enabled."); 
     return YES; 
    } 

    NSLog(@"TouchID NOT enabled: %@", error.localizedDescription); 
    return NO; 
} 
Cuestiones relacionadas