我可以创建在一定时间内保持"unlocked"的私钥吗?



我有一个应用程序,它可以生成几个私钥。当用户需要对数据进行签名时,他们必须使用生物识别技术进行身份验证,并且Secure Enclave使用正确的私钥进行签名。易于理解的

我有一个新的要求-应用程序需要能够在多条数据到达设备时对其进行签名,并且用户在签名第一条数据时只能进行身份验证

所以我的问题是:

  1. 在用户使用生物特征进行身份验证后,是否可以创建一个在一定时间内保持解锁的私钥?如果是,如何?

  2. 是否可以创建一个私钥,在程序告诉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)

然而,这有一个意想不到的行为。私钥保持为";解锁";即使在时间限制已经过去之后。使上下文无效以锁定私钥也不起作用。

为了在批量签名完成后锁定密钥,我们需要:

  1. 取消分配上下文,或重新初始化以备将来使用
  2. 使用新上下文(或不使用上下文(重新加载私钥,因为私钥持有对上下文的强引用

只有在那之后,用户才需要再次使用生物特征进行身份验证,所以请记住这一点。

可以公平地说,没有必要生成新的密钥。这种方法适用于现有密钥。

相关内容

  • 没有找到相关文章

最新更新