Apple, iOS 13, CryptoKit, Secure Enclave - 在使用私钥之前强制执行生物识别身份



我正在使用Apple的新cryptokit库,并试图让一个基本的用例工作。

目标:我想通过加密工具包在安全隔区中创建一个私钥,将密钥的引用存储在 iOS 设备的密钥链中,并确保只有在用户通过某种生物识别身份验证方法进行身份验证后,才能在安全飞区中重新初始化密钥。

当前状态:到目前为止,我能够通过以下代码初始化安全隔区中的私钥:

var privateKeyReference = try CryptoKit.SecureEnclave.P256.KeyAgreement.PrivateKey.init();

此外,我可以从密钥链中存储和检索相应私钥的引用。检索引用后,我可以使用以下代码重新初始化安全区中的私钥:

var privateKeyReference = getPrivateKeyReferenceFromKeyChain();
var privateKey = try CryptoKit.SecureEnclave.P256.KeyAgreement.PrivateKey.init(
dataRepresentation: privateKeyReference
);

到目前为止,一切都按预期工作,并且所有使用私钥的加密操作都成功。

现在,据我了解Apple的备用文档,我应该能够将私钥的第一次初始化修改为如下所示的内容。

let authContext = LAContext();
let accessCtrl = SecAccessControlCreateWithFlags(
kCFAllocatorDefault,
kSecAttrAccesibleWhenUnlockedThisDeviceOnly,
[.privateKeyUsage, .userPresence, .biometryCurrentSet],
nil
);
var privateKeyReference = try CryptoKit.SecureEnclave.P256.KeyAgreement.PrivateKey.init(
accessControl: accessCtrl!,
authenticationContext: authContext
);

因此,确保私钥只能在用户通过某种生物识别身份验证方法进行身份验证时重新初始化。初始初始化工作没有任何错误。

问题:但是,添加前面的代码,我没有得到任何生物识别身份验证提示,并且在重新初始化后根本无法使用私钥。每当我尝试使用重新初始化的密钥执行某些加密操作时,都会记录以下错误,例如一些签名:

Error Domain=CryptoTokenKit Code=-9 "setoken: unable to sign digest" UserInfo={NSLocalizedDescription=setoken: unable to sign digest})

据我从这里猜到,我认为Code=-9指的是"身份验证需要"错误。

问题:有人可以指出我一些文档或教程如何实现我正在寻找的东西或向我解释我缺少什么吗?

谢谢!

交叉帖子:https://forums.developer.apple.com/message/387746

经过几天的耐心,我能够从Apple开发支持中获得答案。他们建议使用以下方法,该方法与我的方法仅略有不同:

var error: Unmanaged<CFError>? = nil;
let accessCtrl = SecAccessControlCreateWithFlags(
nil,
kSecAttrAccesibleAfterFirstUnlockThisDeviceOnly,
[.privateKeyUsage, .biometryCurrentSet],
&error
);
var privateKeyReference = try CryptoKit.SecureEnclave.P256.KeyAgreement.PrivateKey.init(
accessControl: accessCtrl
);

此外,与此同时,iOS版本13.1.3发布,升级我的设备后,上面的代码开始工作。因此,要么我的代码与Apple的代码之间存在细微差异,要么与更新有关。尽管如此,它现在正在工作。

最新更新