5

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

目标:我想通过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是指“authenticationNeeded”错误。

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

谢谢!

交叉发布:https ://forums.developer.apple.com/message/387746

4

1 回答 1

2

经过几天的耐心,我能够从 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 的代码之间存在细微差别,要么与更新有关。尽管如此,它现在正在工作。

于 2019-10-20T13:18:14.647 回答