2

キーチェーンにパスワードを保存し、後でSecKeychainFindGenericPassword()を使用してパスワードを取得するアプリを作成しています。これは90%の確率でファイルを機能させますが、時々、SecKeychainFindGenericPassword()の呼び出しはerrSecAuthFailed(-25293)で失敗します。その場合は、再試行するか、アプリを再起動すると修正されます。

誰かがこれを引き起こしている可能性がある考えを持っていますか?このエラーに関する一般的なGoogle検索は、キーチェーンの破損またはキーチェーンのロックを示しています。後続の呼び出しは再び成功するため、ここではどちらも当てはまりません...

4

5 に答える 5

1

このリンクは、入力したパスフレーズが正しくないことを示しています。ここを参照してください 偶然にパスフレーズとしてnullオブジェクトを送信している可能性はありますか?

または、 EMKeychainを試すこともできます。GitHubに最新バージョンがあります:http://github.com/ctshryock/EMKeychain

于 2009-12-26T01:25:54.530 に答える
1

あなたはあなたの問題の周りのコードを共有していないので、あなたの問題は機能不全のキーチェーンではなく、むしろいくつかのコーディングエラーにあると思います。

一般的な落とし穴は次のとおりです。KeyChainAPIは「C」であり、Cスタイルのnullで終了する文字列バッファのみを受け入れるため、通常、CFString/NSStringオブジェクトをAPIに渡す前にCバッファに変換する必要があります。

多くは次のようなものを使用します:

const char *usernameCStr = [username UTF8String];

NSStringまたはそのCFStringコンパニオンの場合...

const char *CFStringGetCStringPtr(CFStringRef theString, CFStringEncoding encoding);        /* May return NULL at any time; be prepared for NULL */

これらのAPIがNULLを返す可能性があるという事実を却下します。CF / NSStringの内部バッファが連続していないか、要求したエンコーディングに含まれていないか、またはcと互換性がないためです。

このような問題は、実行時に説明したとおりに動作する可能性があります。

このような場合は、問題をキャッチし、別のAPIを使用してCF/NS文字列をCバッファにコピーする必要があります。

Boolean CFStringGetCString(CFStringRef theString, char *buffer, CFIndex bufferSize, CFStringEncoding encoding);

また

- (BOOL)getCString:(char *)buffer maxLength:(NSUInteger)maxBufferCount encoding:(NSStringEncoding)encoding; 
于 2016-09-01T12:50:11.627 に答える
0

これが問題であったかどうかはわかりませんが(どのように問題があったのかわかりません)、最近、コードを変更してstrlen()、sの長さではなくcStringsを適切に呼び出しに渡しNSStringました。技術的には、これはより正確です(UTF-8デュアルバイト文字が含まれる場合、文字列の長さがcStringと異なる可能性があるためです。

しかし、私がテストしたユーザー名/パスワードには非ASCII文字が含まれていなかったため、この問題が実際に表示されていたエラーにどのように影響したかはわかりません。私の新しいコードは次のとおりですが、エラーは発生していません。

UInt32 length;
void *data;
const char *account = [[BC_HOST stringByAppendingFormat:@":%@", login] cStringUsingEncoding:NSUTF8StringEncoding];
NSLog(@"Getting password from keychain.");
OSStatus s = SecKeychainFindGenericPassword (nil, 
                     strlen(BC_APPNAME), BC_APPNAME, 
                     strlen(account), account,
                     &length, &data, &keychainItem);
if (s != 0) NSLog(@"Error %d obtaining password from keychain.", s);
if (s == 0)
{
    password = [[NSString alloc] initWithBytes:data length:length encoding:NSUTF8StringEncoding];
}
于 2011-02-02T10:04:26.013 に答える
0

私は同じ問題を抱えていましたが、私の場合、これが原因であることが判明しました:SMJobBlessの更新後にキーチェーンアイテムにアクセスできません

于 2013-08-15T14:24:16.877 に答える
0

この問題が発生する可能性のある理由の1つは、呼び出しを行う実行可能ファイルがキーチェーンアイテムにアクセスできない場合です。キーチェーンアクセスでは、問題のアイテムの[アクセス制御]タブで、アイテムにアクセスする権限を持つアプリのリストを確認できます。

アプリが別の場所から実行されている場合、このエラーが発生します。たとえば、私は特権ヘルパーツールを持っており、開発マシンでは通常、ルートとしてXcodeを実行します。この実行可能ファイルへのパスは、Xcodeが作成するパスであり、〜/ Library / Developer / Xcode / DerivedData//myexecutableのパスです。ユーザーのように実行すると、/ Library / PrivilegedHelperTools/myexecutableから実行されます。したがって、パスワードが最初にアプリの1つのバージョンによって作成され、別のパスを使用してそれを読み取ろうとすると、errSecAuthFailedエラーが表示されます。

これが唯一の理由ではありません。他の誰かが、SMJobBlessが抱えているインプレースアップグレードの問題について言及しました。これも同じエラーコードになる可能性がありますが、確かに両方の理由で表示されます。ただし、アップグレードを実行する前にヘルパーツールを別の場所に移動するように命令することで、プログラムでアップグレードインプレースの問題を解決しました。

于 2014-03-20T21:12:03.840 に答える