【发布时间】:2011-07-19 03:52:02
【问题描述】:
是否可以更新钥匙串中现有项目的属性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 从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 的值,因为应用程序的需求发生了变化。如果一个应用程序过去在 Keychain 中添加了 10 个项目而没有使用 kSecAttrAccessible 指定保护等级会怎样。如果开发人员没有明确设置保护等级,钥匙串会隐式地为新项目分配值kSecAttrAccessibleWhenUnlocked。稍后,开发人员需要将保护类更改为kSecAttrAccessibleAfterFirstUnlock,因为应用程序必须在后台访问它(多任务)。开发者如何做到这一点?
苹果开发者论坛里已经有一个帖子了,但是还没有答案:https://devforums.apple.com/thread/87646?tstart=0
【问题讨论】:
标签: iphone security ios ipad keychain