iOS钥匙串:更新kSecAttrAccessible时,SecItemUpdate返回-50(paramErr)

Sea*_*lly 5 keychain security-framework ios

我需要更新钥匙串条目的kSecAttrAccessible。我不需要更新实际数据,只需更新可访问性属性即可。

首先,我尝试找到该项目以确保我的查询字典良好:

sanityCheck = SecItemCopyMatching((__bridge CFDictionaryRef)(queryPrivateKey), (void *)&privateKeyRef);
Run Code Online (Sandbox Code Playgroud)

此行成功找到我要查找的商品(返回码为0)。

然后,使用相同的查询更新kSecAttrAccessible属性:

if (sanityCheck == noErr && privateKeyRef != nil) {
    // found it, update accessibility
    NSMutableDictionary *updatedAttributes = [[NSMutableDictionary alloc] init];
    updatedAttributes[(__bridge id)kSecAttrAccessible] = (__bridge id)kSecAttrAccessibleAlways;
    OSStatus updateItemStatus = SecItemUpdate((__bridge CFDictionaryRef)queryPrivateKey, (__bridge CFDictionaryRef)updatedAttributes);
}
Run Code Online (Sandbox Code Playgroud)

此时,updateItemStatus为-50(paramErr)。

我看了一下这个线程:是否可以更新钥匙串项目的kSecAttrAccessible值? 但是我的问题是不同的。即使我将kSecValueData添加到我的代码,它也会返回-50updatedAttributes。此外,文档还指出,我们仅需要为iOS 4和更早版本添加kSecValueData。我支持iOS 7及更高版本,所以这不是我的问题。

有人可以指出我在这里想念的东西吗?非常感谢。

Sea*_*lly 5

查询可以通过 SecItemCopyMatching 成功找到您的钥匙串项目这一事实并不意味着可以使用相同的查询来更新钥匙串项目。

我正在使用以下查询进行项目查找:

[queryPrivateKey setObject:(__bridge id)kSecClassKey forKey:(__bridge id)kSecClass];
[queryPrivateKey setObject:(__bridge id)kSecAttrKeyTypeRSA forKey:(__bridge id)kSecAttrKeyType];
[queryPrivateKey setObject:[NSNumber numberWithBool:YES] forKey:(__bridge id)kSecReturnRef];
[queryPrivateKey setObject:[EncryptionHelper privateKeyTag:JWT_KEYPAIR_TAG] forKey:(__bridge id<NSCopying>)(kSecAttrApplicationTag)];

sanityCheck = SecItemCopyMatching((__bridge CFDictionaryRef)(queryPrivateKey), (void *)&privateKeyef);
Run Code Online (Sandbox Code Playgroud)

但是,为了使用此查询进行项目更新,我首先必须执行以下操作:

[queryPrivateKey removeObjectForKey:(__bridge id)kSecReturnRef];
Run Code Online (Sandbox Code Playgroud)

然后我可以更新:

OSStatus updateItemStatus = SecItemUpdate((__bridge CFDictionaryRef)queryPrivateKey,(__bridge CFDictionaryRef)updatedAttributes);
Run Code Online (Sandbox Code Playgroud)

显然,kSecReturnRef在 的查询字典中不是可接受的键SecItemUpdate。我无法从苹果文档中找到 SecItemUpdate 查询的可接受键列表。从SecItemUpdate的文档来看,似乎只有这些键是可以接受的,但这似乎不是正确的列表,因为我希望列表中包含诸如kSecClass等的键。如果有人有更新的文档链接,请分享它,现在我只需要反复试验才能找出SecItemUpdate.

找到该项目后,更新还有另一个复杂性kSecAttrAccessible:您无法从较高的安全设置更新kSecAttrAccessibleWhenUnlocked到较低的设置,例如kSecAttrAccessibleAlways出于安全原因而将手机锁定,因此必须在手机处于锁定状态时进行迁移解锁。迁移的好地方是应用在前台恢复时,因为当应用在前台时,设备必须处于解锁状态。