是否可以更新钥匙串中现有项目的属性kSecAttrAccessible
的值?看起来,该项目添加到钥匙串后无法更改。以下步骤备份我的假设。从kSecAttrAccessibleWhenUnlocked
是否有可能更新Keychain项目的kSecAttrAccessible值?
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
到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
的值,因为应用程序的要求发生了变化。如果应用程序过去在钥匙串中添加了10个项目而没有用kSecAttrAccessible
指定保护等级,该怎么办?如果开发人员未明确设置保护类别,则钥匙串将隐式分配新项目kSecAttrAccessibleWhenUnlocked
。之后,开发人员需要将保护类更改为kSecAttrAccessibleAfterFirstUnlock
,因为应用程序必须在后台访问它(多任务处理)。开发人员如何实现这一目标?
目前已经在苹果开发者论坛一个线程,但它并没有得到一个答案了:https://devforums.apple.com/thread/87646?tstart=0
现在[记录](https://developer.apple.com/library/ios/documentation/Security/Reference/keychainservices/Reference/reference.html#//apple_ref/c/data/kSecAttrAccessible)为在iOS 4及更早版本中需要。 – 2013-09-16 15:52:22
好找!谢谢。 – mbinna 2013-09-17 07:42:07
如果您使用RSA密钥对,请确保为* both *键执行此操作。 – 2017-07-22 00:29:06