Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/gwt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
苹果、iOS 13、CryptoKit、Secure Enclave-在使用私钥之前实施生物特征认证_Ios_Swift_Cryptography_Apple Cryptokit - Fatal编程技术网

苹果、iOS 13、CryptoKit、Secure Enclave-在使用私钥之前实施生物特征认证

苹果、iOS 13、CryptoKit、Secure Enclave-在使用私钥之前实施生物特征认证,ios,swift,cryptography,apple-cryptokit,Ios,Swift,Cryptography,Apple Cryptokit,我正在与苹果新的加密工具包库合作,并试图让一个基本的用例正常工作 目标:我想通过cryptokit在安全enclave中创建私钥,将密钥引用存储在iOS设备的密钥链中,并确保只有在用户通过某种生物认证方法进行身份验证后,才能在安全enclave中重新初始化密钥 当前状态:到目前为止,我能够通过以下代码初始化安全enclave中的私钥: var privateKeyReference=try CryptoKit.SecureEnclave.P256.KeyAgreement.PrivateKey.

我正在与苹果新的加密工具包库合作,并试图让一个基本的用例正常工作

目标:我想通过cryptokit在安全enclave中创建私钥,将密钥引用存储在iOS设备的密钥链中,并确保只有在用户通过某种生物认证方法进行身份验证后,才能在安全enclave中重新初始化密钥

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

var privateKeyReference=try CryptoKit.SecureEnclave.P256.KeyAgreement.PrivateKey.init();
此外,我可以从密钥链中存储和检索相应私钥的引用。检索引用后,我可以使用以下代码重新初始化secure enclave中的私钥:

var privateKeyReference=getPrivateKeyReferenceFromKeyChain();
var privateKey=try CryptoKit.SecureEnclave.P256.KeyAgreement.privateKey.init(
dataRepresentation:privateKeyReference
);
到目前为止,一切正常,所有使用私钥的加密操作都成功

现在,据我所知,我应该能够修改私钥的第一次初始化,如下所示

让authContext=LAContext();
让accessCtrl=SecAccessControlCreateWithFlags(
KCO默认值,
仅当未锁定此设备时,KSecattraccesible,
[.privateKeyUsage、.userPresence、.biometryCurrentSet],
无
);
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
指的是错误

问题:有人能给我指一些文档或教程,告诉我如何实现我所寻找的目标,或者向我解释我缺少的东西吗

谢谢


交叉帖子:

经过几天的耐心,我终于从苹果开发支持部门得到了答案。他们建议采用以下方法,但与我的方法略有不同:

var error: Unmanaged<CFError>? = nil;
let accessCtrl = SecAccessControlCreateWithFlags(
   nil,
   kSecAttrAccesibleAfterFirstUnlockThisDeviceOnly,
   [.privateKeyUsage, .biometryCurrentSet],
   &error
);
var privateKeyReference = try CryptoKit.SecureEnclave.P256.KeyAgreement.PrivateKey.init(
   accessControl: accessCtrl
);
var错误:非托管?=无
让accessCtrl=SecAccessControlCreateWithFlags(
无
ksecattraccessibleafthefirst仅解锁此设备,
[.privateKeyUsage、.biometryCurrentSet],
&错误
);
var privateKeyReference=try CryptoKit.SecureEnclave.P256.KeyAgreement.PrivateKey.init(
accessControl:accessCtrl
);

此外,在此期间,iOS版本
13.1.3
发布,升级我的设备后,上述代码开始工作。因此,要么我的代码和苹果的代码有细微的区别,要么与更新有关。不过,它现在正在工作。

添加权限时,您是否也在info.plist中输入了权限描述?您指定了吗?@Abulhassan:是的,我在info.plist中添加了face id权限,因为我可以通过一些独立的身份验证上下文使用face id。@Woodstock:据我所知,您的文章,它不是指使用cryptokit创建密钥,是吗?然而,正如我在文章中所写的,我尝试用一个访问控制对象和一个身份验证上下文初始化私钥。这就是你的意思吗?搜索raywanderlilch的《生物计量学验证指南》——他已经详细准备了一个定义明确的教程。