2011-05-31 75 views
18

由于我的应用程序将处理用户的敏感数据,我想知道是否有方法可以从我的应用程序中检查是否在iOS中设置了密码锁。以编程方式检查是否设置密码锁

我需要检查这个的原因是因为如果用户在应用程序中有一些信息,然后将它保存在桌子上并且出去几分钟。 iPad/iPhone默认进入待机模式。如果设置了密码锁,只有当输入正确的密码时,任何人都可以使用ipad。这将提供额外的安全措施,以防止任何过路人从应用中查看敏感数据。

所以基本上,我想我的应用程序检查密码锁是否设置,如果不提示用户这样做。

这可能吗?

+0

我不认为这是可能的。为什么不给应用程序添加锁定机制,以便用户可以锁定而不锁定整个iPad? – ughoavgfhw 2011-05-31 18:20:12

+0

我需要它的情况下,当用户保持ipad关闭,并在紧急情况或某事时消失了一段时间,ipad会自动锁定一段时间后(由于其默认行为)...所以为了防止除了用户以外的任何人解开ipad并查看应用程序中的敏感数据,我需要检查是否为ipad设置了密码锁,如果没有,请提示用户设置密码锁。 。 – learner2010 2011-05-31 20:01:09

回答

3

看看The Application Runtime Environment上的文件保护部分。文件保护要求用户启用密码锁定设置并设置有效的密码。如果您的应用程序写入/创建并存档,请使用NSDataWritingFileProtectionComplete选项。如果您的应用程序不使用任何文件,则创建一个虚拟文件并启用保护。

+1

如果密码锁被禁用,该怎么办?你是否仍然可以手动执行这个文件保护锁定?我曾经观看过关于安全应用程序数据的wwdc 2010,但它假设您已经设置了密码锁定。你如何执行这个? – fes 2011-07-14 01:08:50

+1

这不再适用。周围的阅读表明,它至少从iOS 5起并没有工作。 – Simon 2014-04-02 10:07:48

9

使用iOS 8,现在有一种方法可以检查用户是否设置了密码。 该代码会崩溃在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; 
} 

斯威夫特:

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

这是苹果批准? – Nil 2014-10-17 07:03:21

+1

它应该没问题,因为它使用的是标准钥匙串调用。 – 2014-10-17 18:34:18

2

Xamarin.iOS解决方案适用于iOS 8 ...注意我打电话SecKeyChain.Remove(secRecord)每检查。我发现,如果我不包括这个我能得到的设备进入它试图与每个呼叫的用户进行身份验证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

谢谢。我需要这个! – HansElsen 2017-01-11 12:33:26

5

由于iOS 9一个奇怪的状态,有一个标志LAPolicyDeviceOwnerAuthentication在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; 
} 

由于iOS 8已经有另一个标志为是否启用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; 
} 
相关问题