【问题标题】:Is it possible to use Touch-ID Authentication AND Keychain sharing in an iOS app?是否可以在 iOS 应用程序中使用 Touch-ID 身份验证和钥匙串共享?
【发布时间】:2015-06-29 07:49:24
【问题描述】:

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

到目前为止,根据我的经验(阅读 - 几天的挫败感),并基于一些钥匙串 API 简化 tools 的功能,例如 UICKeychainStore,如果我使用 Touch ID身份验证、钥匙串共享不起作用,反之亦然。我正在寻找能说明这一点的 Apple 文档,但找不到。

我浏览了 Apple 的 SecItem.h 页面,我发现一个有用的信息是关于 kSecAttrAccessiblekSecAttrSynchronizable 的: “如果在 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]];
    });
}

【问题讨论】:

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


    【解决方案1】:

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

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

    ACL 保护项目 - 不同步,不备份

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

    【讨论】:

      【解决方案2】:

      这个示例项目可能会有所帮助,标题是KeychainTouchID: Using Touch ID with Keychain and LocalAuthentication

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

      这可能仅限于本地,不能共享。

      【讨论】:

      • 是的,这就是我提到的实现 Touch ID 身份验证的项目。但它不包括设备之间的钥匙串共享。
      • 我在这里可能是错的,但据我了解,TouchID 在设备内有自己的存储空间,操作系统无法以任何方式读取来共享数据。我是看WWDC where they announced TouchID才知道的。
      猜你喜欢
      • 2020-12-25
      • 1970-01-01
      • 2011-05-06
      • 1970-01-01
      • 1970-01-01
      • 2012-06-14
      • 2019-10-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多