Сбой извлечения сохраненных паролей из цепочки для ключей за пределами XCode

Я храню общие пароли в цепочке для ключей, следуя примеру кода Apple в «Руководстве по программированию служб цепочки для ключей».

Все работает нормально, пока я запускаю приложение в режиме отладки из Xcode. Однако, когда я архивирую и экспортирую приложение, оно по-прежнему будет хранить пароли (видимые в Keychain Access), но не сможет их получить.

Связка ключей постоянно возвращает errSecAuthFailed (-25293). Это происходит на горном льве, но не на снежном барсе. Мое приложение подписано кодом и находится в песочнице. Мне кажется, что при получении пароля связка ключей не распознает приложение как то же самое, в котором хранится пароль, потому что, когда я устанавливаю пароль, доступный любому приложению, он также работает хорошо.

Я использую следующий код:

+ (NSString*) retrievePasswordFromKeychainWithKey: (NSString*) theKey {    
    SecKeychainUnlock(NULL, 0, NULL, FALSE);
    const char* userNameUTF8 = [NSUserName() UTF8String];
    uint32_t userNameLength = (uint32_t)strlen(userNameUTF8);
    uint32_t serviceNameLength = (uint32_t)strlen([theKey UTF8String]);

    uint32_t pwLength = 0; 
    void* pwBuffer = nil; 
    SecKeychainItemRef itemRef = nil;
    OSStatus status1 = SecKeychainFindGenericPassword (NULL, serviceNameLength,  serviceNameUTF8, userNameLength, userNameUTF8, &pwLength, &pwBuffer, &itemRef);

    if (status1 == noErr) {
        NSData* pwData = [NSData dataWithBytes:pwBuffer length:pwLength];
        SecKeychainItemFreeContent (NULL,     //No attribute data to release
                                    pwBuffer    //Release data buffer allocated by SecKeychainFindGenericPassword
                                    );
        return [NSString stringWithCString:[pwData bytes] encoding:NSUTF8StringEncoding];
    }
    //status1 is always -25293
    return nil;   
}

person codingFriend1    schedule 08.08.2012    source источник


Ответы (1)


Хорошо, я только что узнал, что это открытая ошибка в Mac OS 10.8.0. Приложения, подписанные идентификатором разработчика, не могут получить доступ к данным из цепочки для ключей. Я надеюсь, что это будет исправлено в 10.8.1...

Обходной путь — не подписывать приложение своим идентификатором разработчика. (Я также читал, что приложения, созданные под Lion, не подвержены этой ошибке, но я пока не смог это проверить)

person codingFriend1    schedule 09.08.2012
comment
У меня такая же проблема на 10.8, очень интересно. Я планирую продавать свое приложение в магазине MacApp, и это одна из ошибок, которые мне осталось исправить. - person banderson623; 14.08.2012
comment
Это было незаметно исправлено в 10.8.1. - person codingFriend1; 24.08.2012