首先,我尝试找到该项目,以确保我的查询字典是好的:
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).
我看过这个帖子:Is it possible to update a Keychain item’s kSecAttrAccessible value?
但是我的问题不同了.即使我将kSecValueData添加到我的updatedAttributes,它也会返回-50.此外,文档还指出我们只需要为iOS 4及更早版本添加kSecValueData.我支持iOS 7及更高版本,所以这不应该是我的问题.
谁能指出我在这里缺少的东西?非常感谢.
解决方法 查询可以通过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的文档来看,似乎只有these keys是可以接受的,但这似乎不是正确的列表,因为我期望像kSecclass等密钥在列表中.如果有人有更新的文档链接,请分享它,现在它只需要我一些试验和错误来找出SecItemUpdate可以接受哪些密钥.
找到该项后,更新kSecAttrAccessible还有另一个复杂性:当手机因安全原因被锁定时,您无法从kSecAttrAccessibleWhenUnlocked这样的较高安全设置更新到kSecAttrAccessibleAlways这样的较低设置,因此迁移必须在手机已解锁.迁移的一个好地方是应用程序在前台恢复时,因为当应用程序处于前台时,设备必须处于解锁状态.
总结以上是内存溢出为你收集整理的iOS钥匙串:更新kSecAttrAccessible时,SecItemUpdate返回-50(paramErr)全部内容,希望文章能够帮你解决iOS钥匙串:更新kSecAttrAccessible时,SecItemUpdate返回-50(paramErr)所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)