簡體   English   中英

kSecAttrAccessibleAfterFirstUnlock即使在首次解鎖iOS之后也不允許訪問

[英]kSecAttrAccessibleAfterFirstUnlock not allowing access even after first unlock iOS

因此,我有一個舊的敏感訪問密鑰,當前具有對kSecAttrAccessibleWhenUnlocked的可訪問性,我想將其更新為kSecAttrAccessibleAfterFirstUnlock。

我正在使用Lockbox並稱其為:

[Lockbox setString:accessKey forKey:self.accessKeyName accessibility:kSecAttrAccessibleAfterFirstUnlock];

依次將其稱為:

-(BOOL)setObject:(NSString *)obj forKey:(NSString *)key accessibility:(CFTypeRef)accessibility
{
    OSStatus status;

    NSString *hierKey = [self _hierarchicalKey:key];

    // If the object is nil, delete the item
    if (!obj) {
        NSMutableDictionary *query = [self _query];
        [query setObject:hierKey forKey:(LOCKBOX_ID)kSecAttrService];
        status = SecItemDelete((LOCKBOX_DICTREF)query);
        return (status == errSecSuccess);
    }

    NSMutableDictionary *dict = [self _service];
    [dict setObject: hierKey forKey: (LOCKBOX_ID) kSecAttrService];
    [dict setObject: (LOCKBOX_ID)(accessibility) forKey: (LOCKBOX_ID) kSecAttrAccessible];
    [dict setObject: [obj dataUsingEncoding:NSUTF8StringEncoding] forKey: (LOCKBOX_ID) kSecValueData];

    status = SecItemAdd ((LOCKBOX_DICTREF) dict, NULL);
    if (status == errSecDuplicateItem) {
        NSMutableDictionary *query = [self _query];
        [query setObject:hierKey forKey:(LOCKBOX_ID)kSecAttrService];
        status = SecItemDelete((LOCKBOX_DICTREF)query);
        if (status == errSecSuccess)
            status = SecItemAdd((LOCKBOX_DICTREF) dict, NULL);
    }
    if (status != errSecSuccess)
        DLog(@"SecItemAdd failed for key %@: %d", hierKey, (int)status);

    return (status == errSecSuccess);
}

如您在上方所見,如果有重復項,密碼箱代碼似乎會嘗試添加該項。 我在此處放置了一個斷點,可以確認它確實有效。

但是,有時仍然會出現以下錯誤:

<Error>:  SecOSStatusWith error:[-25308] The operation couldn’t be completed. (OSStatus error -25308 - Remote error : The operation couldn‚Äôt be completed. (OSStatus error -25308 - ks_crypt: e00002e2 failed to unwrap item (class 6, bag: 0) Access to item attempted while keychain is locked.))

我不明白為什么會得到這個-我已經解鎖了手機,它應該可以正常工作。 有任何想法嗎?

我還應該補充一點,當應用程序被殺死並通過區域監視更新在后台恢復時,我需要訪問它。

我必須在新密鑰之前先清除舊密鑰。 您可以執行此操作,也可以使用新的kSecAccessibility值創建一個具有不同名稱的新密鑰。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM