![](/img/trans.png)
[英]Update Keychain kSecAttrAccessible with SecItemUpdate returns -50
[英]iOS keychain: SecItemUpdate returns -50 (paramErr) when updating kSecAttrAccessible
我需要更新鑰匙串條目的kSecAttrAccessible。 我不需要更新實際數據,只需更新輔助功能屬性。
首先,我嘗試找到該項目,以確保我的查詢字典是好的:
sanityCheck = SecItemCopyMatching((__bridge CFDictionaryRef)(queryPrivateKey), (void *)&privateKeyRef);
這一行成功找到了我要找的項目(返回碼為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);
}
此時,updateItemStatus為-50(paramErr)。
我看過這個帖子: 是否可以更新Keychain項目的kSecAttrAccessible值? 但是我的問題不同了。 即使我將kSecValueData添加到我的updatedAttributes
它也會返回-50。 此外,文檔還指出我們只需要為iOS 4及更早版本添加kSecValueData。 我支持iOS 7及更高版本,所以這不應該是我的問題。
誰能指出我在這里缺少的東西? 非常感謝。
查詢可以通過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);
但是,為了使用此查詢進行項目更新,我首先必須這樣做:
[queryPrivateKey removeObjectForKey:(__bridge id)kSecReturnRef];
然后我可以更新:
OSStatus updateItemStatus = SecItemUpdate((__bridge CFDictionaryRef)queryPrivateKey,(__bridge CFDictionaryRef)updatedAttributes);
顯然, kSecReturnRef
是不是在查詢字典可接受的關鍵SecItemUpdate
。 我無法從Apple文檔中找到SecItemUpdate查詢的可接受鍵列表。 從SecItemUpdate的文檔中,似乎只有這些鍵是可以接受的,但這似乎不是正確的列表,因為我期望像kSecClass
等鍵在列表中。 如果有人有更新的文檔鏈接,請分享它,現在它只需要我一些試驗和錯誤來找出SecItemUpdate
可以接受哪些密鑰。
該項目已被發現之后,也有另一種與更新的復雜性kSecAttrAccessible
:你不能從一個更高的安全性,如設置更新kSecAttrAccessibleWhenUnlocked
像一個較低的設置kSecAttrAccessibleAlways
當手機被鎖定為安全起見,所以在遷移時有發生手機已解鎖。 遷移的一個好地方是應用程序在前台恢復時,因為當應用程序處於前台時,設備必須處於解鎖狀態。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.