6

キーチェーン エントリの 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) です。

私はこのスレッドを見てきました:キーチェーン項目の kSecAttrAccessible 値を更新することは可能ですか? しかし、私の問題は異なります。kSecValueData を my に追加しても -50 が返されますupdatedAttributes。さらに、ドキュメントには、iOS 4 以前の場合にのみ kSecValueData を追加する必要があることも記載されています。私は iOS 7 以降をサポートしているので、これは私の問題ではありません。

ここで私が見逃していることを誰かが指摘できますか? どうもありがとう。

4

1 に答える 1

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);

ただし、このクエリをアイテムの更新に使用するには、まず次のことを行う必要がありました。

[queryPrivateKey removeObjectForKey:(__bridge id)kSecReturnRef];

次に、更新できます:

OSStatus updateItemStatus = SecItemUpdate((__bridge CFDictionaryRef)queryPrivateKey,(__bridge CFDictionaryRef)updatedAttributes);

明らかに、kSecReturnRefのクエリ ディクショナリでは受け入れ可能なキーではありませんSecItemUpdate。Apple のドキュメントから、SecItemUpdate のクエリの許容キーのリストを見つけることができませんでした。SecItemUpdateのドキュメントから、これらのキーのみが受け入れられるようですが、 kSecClassetc のようなキーがリストにあると予想しているため、正しいリストではないようです。誰かが更新されたドキュメント リンクを持っている場合は、それを共有してください。今のところ、どのキーがSecItemUpdate.

アイテムが見つかった後、更新には別の複雑さもあります。セキュリティ上の理由で電話がロックされている場合のように、より高いセキュリティ設定からより低い設定にkSecAttrAccessible更新することはできないため、電話がロックされているときに移行を行う必要があります。ロックされていません。アプリがフォアグラウンドにあるときは、デバイスがロック解除された状態である必要があるため、移行に適した場所は、アプリがフォアグラウンドで再開されたときです。kSecAttrAccessibleWhenUnlockedkSecAttrAccessibleAlways

于 2015-05-26T23:56:28.127 に答える