지문인식 - iOS 앱에서 Touch-ID 인증 및 키 체인 공유를 사용할 수 있습니까?



아이폰7 지문인식 (2)

필자는 키 체인으로 TouchID를 구현할 수 있었으며 키 체인 공유 (여러 장치간에 키 체인 항목 동기화)를 별도로 수행 할 수있었습니다. 둘 다 해보려고하면 잘못된 매개 변수 인 "-50"오류가 발생합니다. 아래 코드에서 kSecAttrAccessControl 또는 kSecAttrSynchronizable을 제거하면 예상대로 작동합니다.

필자는 UICKeychainStore 와 같은 일부 키 체인 API 단순화 tools 의 기능을 바탕으로 내 경험 (읽기 - 며칠간)을 기반으로 Touch ID 인증을 사용하면 키 체인 공유가 작동하지 않으며 그 반대의 경우도 마찬가지입니다. 나는 그것을 말할 수는 있지만 찾을 수없는 Apple 문서를 찾고 있습니다.

필자는 Apple의 SecItem.h 페이지를 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]];
    });
}

https://ffff65535.com


나는 이것에 대한 답을 찾은 것 같아.

WWDC 2014 비디오 (711)에서, 31:48에 다음이 언급된다

ACL 보호 항목 - 동기화 없음, 백업 안함

따라서 터치 ID 인증은 장치 간의 키 체인 공유에 사용할 수 없습니다.






touch-id