我正在使用苹果的新密码工具包库,并试图获得一个基本的用例来工作。
目标:我希望通过加密工具包在安全飞地中创建一个私钥,将密钥的引用存储在iOS设备的密钥链中,并确保只有在用户通过某种生物鉴别方法验证自己之后,才能在安全飞地重新初始化密钥。
当前状态:到目前为止,我能够通过以下代码在安全飞地中初始化私钥:
var privateKeyReference = try CryptoKit.SecureEnclave.P256.KeyAgreement.PrivateKey.init();此外,我还可以从密钥链中存储和检索相应的私钥引用。检索引用后,我可以使用以下代码重新初始化安全飞地中的私钥:
var privateKeyReference = getPrivateKeyReferenceFromKeyChain();
var privateKey = try CryptoKit.SecureEnclave.P256.KeyAgreement.PrivateKey.init(
dataRepresentation: privateKeyReference
);到目前为止,一切都按预期工作,所有带有私钥的密码操作都成功了。
现在,就我所理解的备用苹果公司的文件而言,我应该能够将私钥的第一个初始化修改为如下所示。
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
);因此,当用户通过某种生物鉴别方法对自己进行身份验证时,才能确保私钥只能重新初始化。初始初始化仍然工作,没有任何错误。
Problem:但是,添加了前面的代码,我没有得到任何生物鉴别提示,在重新初始化之后就不能使用私钥了。每当我尝试使用重新初始化的密钥执行某些加密操作时,都会记录以下错误,例如,在这里进行一些签名:
Error Domain=CryptoTokenKit Code=-9 "setoken: unable to sign digest" UserInfo={NSLocalizedDescription=setoken: unable to sign digest})据我从这里猜测,我认为Code=-9指的是"authenticationNeeded“错误。
问题:有人能告诉我一些文档或教程如何实现我正在寻找的东西或向我解释我所缺少的东西吗?
谢谢!
发布于 2019-10-20 13:18:14
经过几天的耐心,我得到了苹果开发支持部门的答复。他们提出了以下方法,与我的方法略有不同:
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,在升级我的设备后,上面的代码开始工作。所以,要么我的代码和苹果的代码有细微的区别,要么与更新有关。尽管如此,它现在起作用了。
https://stackoverflow.com/questions/58102399
复制相似问题