如何在没有 TouchID 和密码的情况下使用 Secure Enclave?

Posted

技术标签:

【中文标题】如何在没有 TouchID 和密码的情况下使用 Secure Enclave?【英文标题】:How to use Secure Enclave without TouchID and Passcode? 【发布时间】:2016-01-14 12:15:18 【问题描述】:

为了生成密钥对,我使用了 Secure Enclave (kSecAttrTokenIDSecureEnclave)。当尝试访问生成的密钥对时,ios 系统会询问 TouchID。下面是我如何生成和访问密钥对的代码快照。

这里有没有一种设置属性/属性的方法,即 Secure Enclave 功能可以在没有 TouchID 和密码的情况下使用?

生成密钥对:

SecAccessControlRef sacObject = SecAccessControlCreateWithFlags(kCFAllocatorDefault,
                                                kSecAttrAccessibleWhenUnlocked,
                                                kSecAccessControlUserPresence | kSecAccessControlPrivateKeyUsage, &error);

    NSDictionary *parameters = @
        (__bridge id)kSecAttrTokenID: (__bridge id)kSecAttrTokenIDSecureEnclave,
        (__bridge id)kSecAttrKeyType: (__bridge id)kSecAttrKeyTypeEC,
        (__bridge id)kSecAttrKeySizeInBits: @256,
        (__bridge id)kSecPrivateKeyAttrs: @
            (__bridge id)kSecAttrAccessControl: (__bridge_transfer id)sacObject,
            (__bridge id)kSecAttrIsPermanent: @YES,
            (__bridge id)kSecAttrLabel: @“SecKey”,
        ,
    ;
SStatus status = SecKeyGeneratePair((__bridge CFDictionaryRef)parameters, &publicKey, &privateKey);

访问密钥对:

    NSDictionary *query = @
        (__bridge id)kSecClass: (__bridge id)kSecClassKey,
        (__bridge id)kSecAttrKeyClass: (__bridge id)kSecAttrKeyClassPrivate,
        (__bridge id)kSecAttrLabel: @"SecKey",
        (__bridge id)kSecReturnRef: @YES
    ;
OSStatus status = SecItemCopyMatching((__bridge CFDictionaryRef)query, (CFTypeRef *)&privateKey);

【问题讨论】:

如果不使用用户身份验证,您如何建议提取详细信息?当然那只是钥匙链...... Secure Enclave 的全部意义在于它保存受 Touch ID 保护的数据。如果您不希望它受 Touch ID 保护,请不要将其放入 Secure Enclave。 你们中的一些人可以发布一个答案,然后我会接受它。 【参考方案1】:

此代码取自 Apple 示例 KeychainTouchID。通过删除 kSecAccessControlTouchIDAny,可以在安全飞地内生成私钥,然后在不输入密码的情况下使用它。

SecAccessControlRef sacObject;

// Should be the secret invalidated when passcode is removed? If not then use `kSecAttrAccessibleWhenUnlocked`.
sacObject = SecAccessControlCreateWithFlags(kCFAllocatorDefault,
                                            kSecAttrAccessibleWhenPasscodeSetThisDeviceOnly,
                                            /*kSecAccessControlTouchIDAny |*/ kSecAccessControlPrivateKeyUsage, &error);

// Create parameters dictionary for key generation.
NSDictionary *parameters = @
    (__bridge id)kSecAttrTokenID: (__bridge id)kSecAttrTokenIDSecureEnclave,
    (__bridge id)kSecAttrKeyType: (__bridge id)kSecAttrKeyTypeEC,
    (__bridge id)kSecAttrKeySizeInBits: @256,
    (__bridge id)kSecPrivateKeyAttrs: @
        (__bridge id)kSecAttrAccessControl: (__bridge_transfer id)sacObject,
        (__bridge id)kSecAttrIsPermanent: @YES,
        (__bridge id)kSecAttrLabel: @"my-se-key",
    ,
;

【讨论】:

以上是关于如何在没有 TouchID 和密码的情况下使用 Secure Enclave?的主要内容,如果未能解决你的问题,请参考以下文章

如何在横向模式下使用 TouchID?

苹果6s怎么使用touchid

没有密码回退的 Touch ID 的 SecItemCopyMatching

出现 TouchID 警报时如何删除状态栏?

怎么设置touchid代替appstore密码

仅使用密码而不是 TouchID 的设备上的本地身份验证