是否可以在iOS应用中使用Touch-ID身份验证和钥匙串共享?

时间:2015-04-21 22:24:44

标签: ios objective-c ios8 keychain touch-id

我已经成功地将KeyID与钥匙串以及钥匙串共享(在多个设备之间同步钥匙串项目)分开实施。当我尝试同时执行它们时,我收到错误“-50”,这是无效参数。 从下面的代码中,删除 kSecAttrAccessControl kSecAttrSynchronizable 按预期方式工作。

根据我的经验(阅读 - 几天的挫折)到目前为止,并基于某些钥匙串API简化tools的功能,如 UICKeychainStore ,似乎我使用触摸ID身份验证,钥匙串共享无效,反之亦然。我正在寻找可以说明但无法找到它的Apple文档。

我已经浏览了Apple的SecItem.h页面,我找到了一个有用的信息,其中包含以下关于 kSecAttrAccessible kSecAttrSynchronizable 的信息: “如果在OS X或iOS上都指定了这两个属性,则kSecAttrAccessible密钥的值可能只是名称不以”ThisDeviceOnly"“结尾的值,因为它们无法同步到另一个设备。但是,我'我没有使用" ThisDeviceOnly" (我目前正在使用 kSecAttrAccessibleAlways 进行测试)

您能否指出Apple是否以及在何处记录此限制?这将有助于我记录它的记录,并继续前进。谢谢。

- (void)addKeychainItemWithIdentifier:(NSString *)identifier andData:(NSData *)data {

    CFErrorRef error = NULL;
    SecAccessControlRef sacObject;
    sacObject = SecAccessControlCreateWithFlags(kCFAllocatorDefault,
                                            kSecAttrAccessibleAlways,
                                            kSecAccessControlUserPresence, &error);
    if(sacObject == NULL || error != NULL)
    {
    NSString *msg0 = [NSString stringWithFormat:NSLocalizedString(@"SEC_ITEM_ADD_CAN_CREATE_OBJECT", nil), error];
    [self printResultWithMessage:msg0];
    return;
    }

    NSDictionary *attributes = @{
                             (__bridge id)kSecClass: (__bridge id)kSecClassGenericPassword,
                             (__bridge id)kSecValueData: data,
                             (__bridge id)kSecAttrAccessible:(__bridge id)kSecAttrAccessibleAlways,
                             (__bridge id)kSecAttrService: identifier,
                             (__bridge id)kSecAttrSynchronizable:(__bridge id)kCFBooleanTrue,
                             (__bridge id)kSecAttrAccessControl: (__bridge_transfer id)sacObject
                             };

    dispatch_async(dispatch_get_global_queue( DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
    OSStatus status =  SecItemAdd((__bridge CFDictionaryRef)attributes, nil);
    NSError *statuserror = [NSError errorWithDomain:NSOSStatusErrorDomain code:status userInfo:nil];
    [self printResultWithMessage:[self keychainErrorToString:status]];
    });
}

2 个答案:

答案 0 :(得分:3)

我想我可能已经找到了答案

在WWDC 2014视频711中,在31:48

提及以下内容
  

ACL受保护的项目 - 无同步,无备份

因此,Touch ID身份验证不能用于设备之间的Keychain Sharing,因为这些项目仅为Device-only

答案 1 :(得分:1)

This example project might help, the title is KeychainTouchID: Using Touch ID with Keychain and LocalAuthentication:

https://developer.apple.com/library/ios/samplecode/KeychainTouchID/Introduction/Intro.html

This might be limited to local though, no sharing.