在osx中​​使用SecKeychainFindGenericPassword时,在passwordData中获取其他数据

时间:2012-11-17 12:11:45

标签: macos printing passwords keychain garbage

我使用以下代码从Keychain获取密码。

-(OSStatus *)getPasswordFromKeyChain:(NSString *)username{
    OSStatus status;

    const char *cService_name = "Mac App";
    UInt32 service_length = strlen(cService_name);

    const char *cUser_name = [username cStringUsingEncoding:NSUTF8StringEncoding];
    UInt32 username_length = strlen(cUser_name);

    void *passwordData = nil; 
    SecKeychainItemRef itemRef = nil;
    UInt32 passwordLength = nil;

    status = SecKeychainFindGenericPassword(
                                    NULL,            // default keychain
                                    service_length,  // length of service name
                                    cService_name,    // service name
                                    username_length,// length of account name
                                    cUser_name,    // account name
                                    &passwordLength,  // length of password
                                    passwordData,        // pointer to password data
                                    NULL             // the item reference
                                    );
    NSLog(@"%s",passwordData);

    status = SecKeychainItemFreeContent (NULL,           //No attribute data to release
                                     passwordData);    //Release data buffer allocated by SecKeychainFindGenericPassword

    return status;
}

当我获得成功状态时,此工作正常。

但是当我尝试打印我获得的密码时,我得到以下结果 - 如果密码超过6个字符,我会在实际密码的末尾看到一些乱码。例如

2012-11-17 12:01:28.731 MAC App[2042:303] sssssss`—~

如果密码小于或等于6个字符,我会得到正确的密码。例如

2012-11-17 12:01:33.244 MAC App[2042:303] ssssss

我的问题是为什么我最终得到这些垃圾字符?以及如何解决此问题?我需要此密码才能在我的应用程序中使用它。

1 个答案:

答案 0 :(得分:1)

我从this link得到了答案。

获取字符的原因在提供的链接中说明。我使用以下代码将密码转换为NSString,这对我有用。

  NSString *tempStr = [[NSString alloc]initWithBytes:passwordData length:passwordLength encoding:NSUTF8StringEncoding];

NSLog(@"%@",tempStr);