Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/119.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 KSECattorokenIDsecurenclave记录在哪里?_Ios_Security_Keychain - Fatal编程技术网

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+开始,不推荐使用,赞成使用。