【问题标题】:Can I create private key that will stay "unlocked" for certain amount of time?我可以创建在一定时间内保持“解锁”状态的私钥吗?
【发布时间】:2022-01-21 20:32:42
【问题描述】:

我有一个生成几个私钥的应用程序。当用户需要对数据进行签名时,他们必须使用生物特征进行身份验证,并且 Secure Enclave 使用适当的私钥对其进行签名。很简单。

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

所以我的问题是:

  1. 是否可以创建一个在用户使用生物识别技术进行身份验证后在一定时间内保持解锁状态的私钥?如果有,怎么做?

  2. 是否可以创建一个在程序告诉 Secure Enclave 锁定它之前保持解锁状态的私钥?如果有,怎么做?

我彻底搜索了文档和堆栈溢出,但没有任何运气。非常感谢任何帮助!

【问题讨论】:

  • 没有人知道你的“安全飞地”现在用私钥做什么或它的功能是什么,但是这个飞地当然可以修改为在用户认证和用户到期时设置一个计时器必须再次验证才能使用密钥。

标签: ios swift security cryptography keychain


【解决方案1】:

好的,经过大量测试,我找到了问题的答案。通常(在我的情况下),每次使用私钥时用户都需要进行身份验证。

为了能够进行批量操作,我们需要使用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. 使用新上下文(或不使用上下文)重新加载私钥,因为私钥持有对上下文的强引用。

只有在那之后,用户才需要再次使用生物识别进行身份验证,因此请记住这一点。

公平地说,无需生成新密钥。此方法适用于现有密钥。

【讨论】:

    猜你喜欢
    • 2012-12-09
    • 1970-01-01
    • 2020-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-21
    相关资源
    最近更新 更多