SecItemAdd上的iOS错误errSecInteractionNotAllowed或-25308

时间:2011-03-01 04:36:57

标签: iphone objective-c xcode ios jailbreak

我写了一些代码来测试将项目添加到钥匙串。我在iPad 4.2.1(越狱)上进行测试。我在iPad上用ldid -S prog签署了二进制文件。

代码:

#import <Security/Security.h>
#import <Security/SecItem.h>
#import <Foundation/NSDictionary.h>
#import <Foundation/NSString.h>
#import <Foundation/NSObject.h>
#import <CoreFoundation/CoreFoundation.h>
#import <Foundation/NSAutoreleasePool.h>
#import <Foundation/NSKeyValueCoding.h>

int main(int argc, char *argv[]) 
     {   
       NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
       NSDictionary *attributesToStore = [NSDictionary dictionaryWithObjectsAndKeys:
         [@"testuser01" dataUsingEncoding:NSUTF8StringEncoding],kSecAttrAccount,
         [@"test123" dataUsingEncoding:NSUTF8StringEncoding],kSecValueData,
         kSecClassInternetPassword,kSecClass,
         [@"www.example.com" dataUsingEncoding:NSUTF8StringEncoding],kSecAttrServer,
         kCFBooleanTrue, kSecReturnPersistentRef, 
         [@"Sample password" dataUsingEncoding:NSUTF8StringEncoding], kSecAttrDescription,
         [@"password label" dataUsingEncoding:NSUTF8StringEncoding],kSecAttrLabel, nil];
        NSData *persistentRef = nil;
        OSStatus result = SecItemAdd((CFDictionaryRef)attributesToStore, (CFTypeRef *)&persistentRef);
        if (noErr == result)
                {   
                 NSLog(@"Added item to Keychain");
                }   
        else {
                NSLog(@"Item add failed");
                NSLog(@"Result code: %d",result);
             }    
       [pool release];
       return 0;
     }

代码编译和链接没有任何噪音或警告。但是在iPad上执行会引发错误-25308

如何解决此错误?

2 个答案:

答案 0 :(得分:0)

我很确定您需要设置kSecClass密钥,以便钥匙串知道您要添加的项目类型。

作为旁注,我发现GenericKeychain示例代码在我重新编写init方法之后有用,如我对我的问题here.

的回答中所述。

答案 1 :(得分:0)

示例代码的主要问题是许多项被编码为NSData对象,其中应使用NSString对象(kSecAttrAccount,kSecAttrLabel,kSecAttrDescription和kSecAttrServer)。我很惊讶这个问题不会导致异常,虽然iOS上的行为可能与Lion不同(我看过这个)。

也可能是指定kSecReturnRef而不是kSecReturnPersistentRef可能更合适(从文档中,使用kSecReturnPersistentRef vends“持久性引用可以存储在磁盘上或在进程之间传递”)。这是一种指定用于SecItemUpdate,SecItemDelete或SecItemCopyMatching的钥匙串项的方法,它使用kSecMatchItemList,它具有会话之间持久性(比如使用NSUserDefaults)或传递给另一个进程的优点。如果该项仅在应用程序的生命周期内使用,或者更适合使用其他属性查找,则使用kSecReturnRef的项引用可能更合适。