iphone – 是否可以更新Keychain项的kSecAttrAccessible值?

iphone – 是否可以更新Keychain项的kSecAttrAccessible值?,第1张

概述是否可以更新Keychain中现有项目的属性kSecAttrAccessible的值?在将项目添加到钥匙串后似乎无法更改。以下步骤备份我的假设。 添加一个新的项目到钥匙串: NSData *encodedIdentifier = [@"BUNDLE_IDENTIFIER" dataUsingEncoding:NSUTF8StringEnc 是否可以更新Keychain中现有项目的属性kSecAttrAccessible的值?在将项目添加到钥匙串后似乎无法更改。以下步骤备份我的假设。

添加一个新的项目到钥匙串:

NSData *encodedIDentifIEr = [@"BUNDLE_IDENTIFIER"                              dataUsingEnCoding:NSUTF8StringEnCoding];NSData *encodedPassword = [@"PASSWORD"                           dataUsingEnCoding:NSUTF8StringEnCoding];// Construct a Keychain itemNSDictionary *keychainItem =     [NSDictionary dictionaryWithObjectsAndKeys:        kSecclassGenericPassword,kSecclass,encodedIDentifIEr,kSecAttrGeneric,kSecAttrService,@"USERname",kSecAttrAccount,kSecAttrAccessibleWhenUnlocked,kSecAttrAccessible,encodedPassword,kSecValueData        nil];// Add item to KeychainOsstatus addItemStatus = SecItemAdd((CFDictionaryRef)keychainItem,NulL);

稍后,将属性kSecAttrAccessible从kSecAttrAccessibleWhenUnlocked更改为kSecAttrAccessibleAfterFirstUnlock:

NSData *encodedIDentifIEr = [@"BUNDLE_IDENTIFIER"                              dataUsingEnCoding:NSUTF8StringEnCoding];NSDictionary *query = [NSDictionary dictionaryWithObjectsAndKeys:                       kSecclassGenericPassword,nil];NSDictionary *updatedAttributes =     [NSDictionary dictionaryWithObject:kSecAttrAccessibleAfterFirstUnlock                                 forKey:kSecAttrAccessible];Osstatus updateItemStatus = SecItemUpdate((CFDictionaryRef)query,(CFDictionaryRef)updatedAttributes);

这种方法的问题是updateItemStatus总是导致状态errSecUnimplemented。

我认为应该可以更新kSecAttrAccessible的值,因为应用程序的需求改变了。如果一个应用程序在过去没有使用kSecAttrAccessible指定保护类别的情况下,向Keychain添加了十个项目,该怎么办?如果开发人员未明确设置保护类,Keychain将新项目隐式分配值为kSecAttrAccessibleWhenUnlocked的值。之后,开发者需要将保护类更改为kSecAttrAccessibleAfterFirstUnlock,因为应用程序必须在后台访问它(多任务)。开发人员如何才能完成这项工作?

苹果开发者论坛中已经有一个线程,但还没有得到答案:https://devforums.apple.com/thread/87646?tstart=0

解决方法 在Apple开发者技术支持(ADTS)开启支持事件之后,我收到了一个回答这个问题的答复。 SecItemUpdate()通过属性kSecValueData需要Keychain项的数据来执行属性kSecAttrAccessible的更新。根据ADTS,这个约束目前没有记录在参考文献中。

NSData *encodedIDentifIEr = [@"BUNDLE_IDENTIFIER"                              dataUsingEnCoding:NSUTF8StringEnCoding];NSDictionary *query = [NSDictionary dictionaryWithObjectsAndKeys:                       kSecclassGenericPassword,nil];// Obtain the Keychain item's data via SecItemcopyMatching()NSData *itemData = ...;NSDictionary *updatedAttributes =     [NSDictionary dictionaryWithObjectsAndKeys:        kSecAttrAccessibleAfterFirstUnlock,(CFDataRef)itemData,kSecValueData,nil];Osstatus updateItemStatus = SecItemUpdate((CFDictionaryRef)query,(CFDictionaryRef)updatedAttributes);// updateItemStatus should have the value errSecSuccess
总结

以上是内存溢出为你收集整理的iphone – 是否可以更新Keychain项的kSecAttrAccessible值?全部内容,希望文章能够帮你解决iphone – 是否可以更新Keychain项的kSecAttrAccessible值?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1086739.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-27
下一篇 2022-05-27

发表评论

登录后才能评论

评论列表(0条)

保存