2

我正在将序列化的 nsdictionary 存储并加载到钥匙串中,如本文(将NSDictionary 存储在钥匙串中),但我需要能够更新/编辑字典内容,所以我想删除它并重新添加。

我只是不知道该怎么做。我从上面的帖子中获取了以下代码:

    KeychainItemWrapper *keychain = [[KeychainItemWrapper alloc] initWithIdentifier:@"arbitraryId" accessGroup:nil]
    NSString *error;
    //The following NSData object may be stored in the Keychain
    NSData *dictionaryRep = [NSPropertyListSerialization dataFromPropertyList:dictionary format:NSPropertyListXMLFormat_v1_0 errorDescription:&error];
    [keychain setObject:dictionaryRep forKey:kSecAttrService];

    //When the NSData object object is retrieved from the Keychain, you convert it back to NSDictionary type
    dictionaryRep = [keychain objectForKey:kSecAttrServce];
    NSDictionary *dictionary = [NSPropertyListSerialization propertyListFromData:dictionaryRep mutabilityOption:NSPropertyListImmutable format:nil errorDescription:&error];

    SecItemDelete((CFDictionaryRef)dictionaryRep); // doesnt work

这些值不会从钥匙串中删除。

谢谢

4

2 回答 2

1

这是一个奇怪的存储数据的地方。您将其放入kSecAttrService未加密的 中。我想你的意思是把它放进去kSecValueData(这是钥匙串中唯一被加密的部分)。

也就是说,没有必要删除该项目。您可以随时使用[keychain setObject:forKey:]来更新值。KeychainItemWrapper自动检测项目是否已经存在,如果存在则更新它。

如果要使用 删除项目KeychainItemWrapper,请使用-resetKeychainItem。这调用SecItemDelete()了正确的值。如果不充分了解 Keychain API 及其工作原理,您通常无法混合搭配使用KeychainItemWrapper和原始调用。SecItem*KeychainItemWrapper

于 2013-04-23T16:55:11.643 回答
0

虽然我从来没有接触过钥匙串属性。但是通过查看SecItemDeleteApple 文档中的方法,预期的参数是一个字典,在你的代码中你传递dictionaryRep的是一个NSData类型。

https://developer.apple.com/library/mac/#documentation/security/Reference/keychainservices/Reference/reference.html#//apple_ref/doc/c_ref/SecItemDelete

在这里找到一个问题,希望它可能会有所帮助。

我想在 Mac OS X 上删除我自己创建的 KeyChain 中的所有项目

于 2013-04-23T16:53:04.923 回答