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

前端之家收集整理的这篇文章主要介绍了在iOS应用程序中可以使用Touch-ID身份验证和钥匙串共享吗?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我已经成功地实现了具有钥匙串的TouchID以及钥匙串共享(分别在多个设备之间同步钥匙串项目).当我尝试做这两个,我得到一个错误“-50”这是无效的参数.
从以下代码中,删除kSecAttrAccessControl或kSecAttrSynchronizable可以按预期方式工作.

根据我迄今为止的经验(阅读 – 几天的沮丧),并且基于像UICKeychainStore这样的一些钥匙串API简化tools功能,似乎如果我使用Touch ID身份验证,钥匙串共享将无法正常工作,反之亦然.我正在寻找一个苹果文档,将声明,但无法找到它.

我已经通过了苹果的SecItem.h页面,并发现一个有用的信息,我发现以下关于kSecAttrAccessible和kSecAttrSynchronizable:
“如果在OS X或iOS上都指定了两个属性,那么kSecAttrAccessible键的值只能是一个名称不以”ThisDeviceOnly“结尾,因为它们不能同步到另一个设备.”但是,我没有使用“ ThisDeviceOnly“(我目前正在使用kSecAttrAccessibleAlways进行测试)

你能帮助指出苹果如何记录这个限制?这将帮助我记录下来的记录,并继续前进.谢谢.

- (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]];
    });
}

解决方法

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

在WWDC 2014视频711中,以下在31:48提到

ACL Protected Items – No Synchronization,No Back up

因此,Touch ID身份验证不能用于设备之间的钥匙串共享,因为这些项目是仅限于设备的

猜你在找的iOS相关文章