1

次のコードを使用して、キーチェーンからパスワードを取得しています。

-(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

私の質問は、なぜこれらのゴミの文字が最後に表示されるのですか? この問題を解決するにはどうすればよいですか? アプリケーションで使用するには、このパスワードが必要です。

4

1 に答える 1

1

私はこのリンクから私の答えを得ました。

文字を取得する理由は、提供されているリンクで説明されています。次のコードを使用してパスワードをNSStringに変換しましたが、それでうまくいきました。

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

NSLog(@"%@",tempStr);
于 2012-11-17T12:28:59.353 に答える