更新已经存在于Keychain中的项目的属性kSecAttrAccessible
的值是否可能?看起来似乎在将项目添加到Keychain后无法更改它。以下步骤支持了我的想法。
向Keychain添加一个新项目:
NSData *encodedIdentifier = [@"BUNDLE_IDENTIFIER"
dataUsingEncoding:NSUTF8StringEncoding];
NSData *encodedPassword = [@"PASSWORD"
dataUsingEncoding:NSUTF8StringEncoding];
// Construct a Keychain item
NSDictionary *keychainItem =
[NSDictionary dictionaryWithObjectsAndKeys:
kSecClassGenericPassword, kSecClass,
encodedIdentifier, kSecAttrGeneric,
encodedIdentifier, kSecAttrService,
@"USERNAME", kSecAttrAccount,
kSecAttrAccessibleWhenUnlocked, kSecAttrAccessible,
encodedPassword, kSecValueData
nil];
// Add item to Keychain
OSStatus addItemStatus = SecItemAdd((CFDictionaryRef)keychainItem, NULL);
稍后将属性 kSecAttrAccessible
从 kSecAttrAccessibleWhenUnlocked
更改为 kSecAttrAccessibleAfterFirstUnlock
:
NSData *encodedIdentifier = [@"BUNDLE_IDENTIFIER"
dataUsingEncoding:NSUTF8StringEncoding];
NSDictionary *query = [NSDictionary dictionaryWithObjectsAndKeys:
kSecClassGenericPassword, kSecClass,
encodedIdentifier, kSecAttrGeneric,
encodedIdentifier, kSecAttrService,
nil];
NSDictionary *updatedAttributes =
[NSDictionary dictionaryWithObject:kSecAttrAccessibleAfterFirstUnlock
forKey:kSecAttrAccessible];
OSStatus updateItemStatus = SecItemUpdate((CFDictionaryRef)query,
(CFDictionaryRef)updatedAttributes);
这种方法的问题在于,updateItemStatus
总是导致状态 errSecUnimplemented
。我认为应该可以更新
kSecAttrAccessible
的值,因为应用程序的要求会发生变化。如果一个应用程序在过去添加了十个项目到钥匙串中,而没有使用 kSecAttrAccessible
指定保护级别,那么如果开发人员没有明确设置保护级别,则钥匙串会隐式地将新项目分配给值为 kSecAttrAccessibleWhenUnlocked
。稍后,开发人员需要将保护级别更改为 kSecAttrAccessibleAfterFirstUnlock
,因为应用程序必须在后台(多任务)中访问它。开发人员如何才能实现这一点?Apple Developer论坛中已经有了一个主题,但还没有得到答案: https://devforums.apple.com/thread/87646?tstart=0
kSecAttrAccessible
来生成密钥对吗?我应该如何设置kSecAttrAccessible
来读取它?我的问题只是针对密钥对。谢谢。 - Mo Farhand