Ошибка iOS: errSecInteractionNotAllowed или –25308 в SecItemAdd - PullRequest
0 голосов
/ 01 марта 2011

Я написал некоторый код для проверки добавления элемента в цепочку для ключей. Я тестирую на iPad 4.2.1 (взломанный). Я подписал двоичный файл с ldid -S prog на iPad.

Код:

#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 голосов
/ 12 сентября 2011

Основная проблема с примером кода состоит в том, что многие элементы кодируются как объекты NSData, где должны использоваться объекты NSString (kSecAttrAccount, kSecAttrLabel, kSecAttrDescription и kSecAttrServer). Я удивлен, что эта проблема не приведет к исключению, хотя поведение на iOS может отличаться от Lion (где я на это смотрел).

Может также оказаться, что указание kSecReturnRef вместо kSecReturnPersistentRef может быть более уместным (из документации, используя kSecReturnPersistentRef vends, «постоянная ссылка может храниться на диске или передаваться между процессами»). Это способ указать элемент цепочки для ключей для использования с SecItemUpdate, SecItemDelete или SecItemCopyMatching, используя его с kSecMatchItemList, который имеет преимущество постоянства между сеансами (скажем, с помощью NSUserDefaults) или передачи другому процессу. Если элемент используется только в течение жизненного цикла приложения или более уместно найти его с использованием других атрибутов, то ссылка на элемент с использованием kSecReturnRef, вероятно, более уместна.

0 голосов
/ 01 марта 2011

Я почти уверен, что вам нужно установить ключ kSecClass, чтобы цепочка для ключей знала, какой элемент вы пытаетесь добавить.

В качестве примечания я нашел пример кода GenericKeychain быть полезным после того, как я переписал метод init, описанный в моем ответе на мой вопрос здесь.

...