当使用kSecAttrAccessibleWhenUnlocked时设备被锁定时,为什么Keychain可以访问?

时间:2013-10-28 14:37:32

标签: ios security keychain

在向钥匙串添加值时,我设置了kSecAttrAccessibleWhenUnlocked键。 documentation州:

  

只有在用户解锁设备时,才能访问钥匙串项目中的数据。

我写了一个简单的测试应用,这里是viewDidLoad方法:

[[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:nil];

// Device (with passcode lock) is locked now

double delayInSeconds = 6.0;
dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delayInSeconds * NSEC_PER_SEC));
dispatch_after(popTime, dispatch_get_main_queue(), ^(void){

    NSError * error = nil;

    [MyKeychainWrapper setKeychainObject:@"abc"
                                  forKey:@"key"
                                   error:&error];
    NSLog(@"Setting Error: %@", error); // No error logged

    NSString * value = (NSString *) [MyKeychainWrapper keychainObjectForKey:@"key"
                                                                      error:&error];
    NSLog(@"value: %@", value); // Logs ABC when the device is locked
    NSLog(@"Getting Error: %@", error); // No error logged
});

设备锁定时如何保存和读取数据?

1 个答案:

答案 0 :(得分:2)

有点不清楚你是如何测试它的,我假设你正在运行代码,然后按下手机上的电源按钮。 按下电源按钮后不会立即锁定钥匙串,因此您的应用程序将能够在按下电源按钮后短时间(约10秒)访问钥匙串项目。

适用于iOS;如果您在开发者模式的手机上运行此代码,查看控制台,您会注意到在按下手机上的电源按钮后实际锁定钥匙串需要几秒钟。在我的iPhone 5上,它需要10秒钟,具体取决于正在运行的应用程序。解锁设备也是如此,在解锁钥匙链之前需要一段时间。这是我刚刚做的一个例子;请注意,从“锁定”到“锁定”打印输出大约需要10秒钟。

May  5 14:26:20 I50 kernel[0] <Debug>: AppleKeyStore::start_keybag_locking: Device Locking..
May  5 14:26:20 I50 kernel[0] <Debug>: ALS: AppleARMBacklight::handleMessageGated - framebufferState -> 0
May  5 14:26:30 I50 UserEventAgent[14] <Error>:  LockStateNotifier aksNotificationCallback posting notification: com.apple.mobile.keybagd.lock_status
May  5 14:26:30 I50 kernel[0] <Debug>: AppleKeyStore:Sending lock change 1
May  5 14:26:30 I50 kernel[0] <Debug>: AppleKeyStore::device_state_transition: Device Locked, lockstate=1

AFAIK确切的时间不是Apple指定的,但6秒可能不足以使钥匙串锁定。