我有一个应用程序,它可以生成几个私钥。当用户需要对数据进行签名时,他们必须使用生物识别技术进行身份验证,并且Secure Enclave使用正确的私钥进行签名。易于理解的
我有一个新的要求-应用程序需要能够在多条数据到达设备时对其进行签名,并且用户在签名第一条数据时只能进行身份验证。
所以我的问题是:
-
在用户使用生物特征进行身份验证后,是否可以创建一个在一定时间内保持解锁的私钥?如果是,如何?
-
是否可以创建一个私钥,在程序告诉Secure Enclave将其锁定之前一直处于解锁状态?如果是,如何?
我彻底搜索了文档和堆栈溢出,但没有任何运气。非常感谢您的帮助!
好吧,经过一些测试,我找到了问题的答案。通常(在我的情况下(,每次使用私钥时,用户都需要进行身份验证。
为了能够进行批量操作,我们需要使用LAContext
并设置重用持续时间:
let context = LAContext()
context.touchIDAuthenticationAllowableReuseDuration = 10.0 // 10 seconds
在加载私钥时将上下文添加到属性中:
let attributes: [CFString: Any] = [
// ...
kSecUseAuthenticationContext: context
// ...
]
var item: CFTypeRef?
let status = SecItemCopyMatching(query as CFDictionary, &item)
然而,这有一个意想不到的行为。私钥保持为";解锁";即使在时间限制已经过去之后。使上下文无效以锁定私钥也不起作用。
为了在批量签名完成后锁定密钥,我们需要:
- 取消分配上下文,或重新初始化以备将来使用
- 使用新上下文(或不使用上下文(重新加载私钥,因为私钥持有对上下文的强引用
只有在那之后,用户才需要再次使用生物特征进行身份验证,所以请记住这一点。
可以公平地说,没有必要生成新的密钥。这种方法适用于现有密钥。