Ios KSECattorokenIDsecurenclave记录在哪里?
我正在绞尽脑汁,试图用Ios KSECattorokenIDsecurenclave记录在哪里?,ios,security,keychain,Ios,Security,Keychain,我正在绞尽脑汁,试图用ksecattertokenidsecurenclave生成一个私钥对,以便私钥在安全的enclave中生成 ksecattertokenidsecurenclave记录在哪里?下面是我的代码,失败状态代码为-50 - (void)generateKeyPair { const UInt8 publicTagString[] = "public"; const UInt8 privateTagString[] = "private"; public
ksecattertokenidsecurenclave
生成一个私钥对,以便私钥在安全的enclave中生成
ksecattertokenidsecurenclave
记录在哪里?下面是我的代码,失败状态代码为-50
- (void)generateKeyPair {
const UInt8 publicTagString[] = "public";
const UInt8 privateTagString[] = "private";
publicTag = CFDataCreate(0, publicTagString, sizeof(publicTagString));
privateTag = CFDataCreate(0, privateTagString, sizeof(privateTagString));
CFMutableDictionaryRef publicAttr = CFDictionaryCreateMutable(kCFAllocatorDefault, 0, NULL, NULL);
CFDictionaryAddValue(publicAttr, kSecAttrApplicationTag, publicTag);
// CFDictionaryAddValue(publicAttr, kSecAttrIsPermanent, kCFBooleanTrue);
CFDictionaryAddValue(publicAttr, kSecAttrCanEncrypt, kCFBooleanFalse);
CFDictionaryAddValue(publicAttr, kSecAttrCanDecrypt, kCFBooleanFalse);
CFDictionaryAddValue(publicAttr, kSecAttrCanDerive, kCFBooleanFalse);
CFDictionaryAddValue(publicAttr, kSecAttrCanSign, kCFBooleanFalse);
CFDictionaryAddValue(publicAttr, kSecAttrCanVerify, kCFBooleanTrue);
CFDictionaryAddValue(publicAttr, kSecAttrCanUnwrap, kCFBooleanFalse);
CFMutableDictionaryRef privateAttr = CFDictionaryCreateMutable(kCFAllocatorDefault, 0, NULL, NULL);
CFDictionaryAddValue(privateAttr, kSecAttrApplicationTag, privateTag);
// CFDictionaryAddValue(privateAttr, kSecAttrIsPermanent, kCFBooleanTrue);
CFDictionaryAddValue(privateAttr, kSecAttrCanEncrypt, kCFBooleanFalse);
CFDictionaryAddValue(privateAttr, kSecAttrCanDecrypt, kCFBooleanFalse);
CFDictionaryAddValue(privateAttr, kSecAttrCanDerive, kCFBooleanFalse);
CFDictionaryAddValue(privateAttr, kSecAttrCanSign, kCFBooleanTrue);
CFDictionaryAddValue(privateAttr, kSecAttrCanVerify, kCFBooleanFalse);
CFDictionaryAddValue(privateAttr, kSecAttrCanUnwrap, kCFBooleanFalse);
const void* parameterKeys[] = {
kSecAttrKeyType,
kSecAttrKeySizeInBits,
kSecAttrTokenID,
kSecPublicKeyAttrs,
kSecPrivateKeyAttrs
};
int intKeySize = 512;
CFNumberRef keySize = CFNumberCreate(kCFAllocatorDefault, kCFNumberIntType, &intKeySize);
const void* parameterValues[] = {
kSecAttrKeyTypeRSA,
keySize,
kSecAttrTokenIDSecureEnclave,
publicAttr,
privateAttr
};
CFDictionaryRef parameters = CFDictionaryCreate(
kCFAllocatorDefault,
parameterKeys,
parameterValues,
5, // ??? Make this programmatic
NULL,
NULL
);
OSStatus status = SecKeyGeneratePair(parameters, &publicKey, &privateKey);
if(status != errSecSuccess) {
[self logError:[NSString stringWithFormat:@"SecKeyGeneratePair status %d", (int)status] :nil];
return;
}
}
您得到的错误,
-50
,表示参数错误。传递给函数的参数不正确或不适合该操作。如果查看SecItem
标题或,您将看到:
ksecattrtokenidsecurencave指定
使用设备的安全Enclave实现的令牌。唯一的钥匙链项目
Secure Enclave令牌支持256位椭圆曲线密钥
(ksecattrkeytypec)。必须使用在安全enclave上生成密钥
kSecAttrTokenID设置为的SecKeyGenerateKeyPair调用
ksecattertokenidsecurencave在参数字典中,它不是
可以将预生成的密钥导入ksecattertokenidsecurenclave令牌
在安全enclave中生成私钥时,RSA目前不受支持。切换到256位EC密钥
WWDC 2015年第706次会议对此进行了讨论。Apple示例项目“KeychainTouchID”显示了使用secure enclave生成和使用密钥的正确参数。“RSA可以正常工作,但无法指定ksecAttorTokenidSecureEnclave和kSecAccessControlPrivateKeyUsage。”。那么我们就不能用ksecattertokenidsecurenclave创建RSA对吗?更新:从iOS 10+开始,不推荐使用,赞成使用。