OSX Lion以降のアプリに取り組んでいます。アプリにはルート デーモン プロセスがあります。/Library/Keychains で「SecKeychainCreate」を使用してシステム全体のキーチェーンを作成しました。このキーチェーンはデーモンのみがアクセスでき、そのキーチェーンに汎用キーを保存したいと考えています。プログラムでこのキーチェーンから汎用キーを取得するのを手伝ってくれる人はいますか? キーチェーンにキーを追加するために、「SecKeychainItemCreateFromContent」関数を使用しました。この関数は SecKeychainRef パラメータを受け入れ、最初のパラメータとして kSecPublicKeyItemClass を渡しました。これが私のコードです:
char *itemLabel = "Generic public key";
//Setting up the attribute vector (each attribute consists of {tag, length, pointer}):
SecKeychainAttribute attrs[] = {kSecLabelItemAttr, strlen(itemLabel), itemLabel};
SecKeychainAttributeList attributes = { sizeof(attrs)/sizeof(attrs[0]), attrs };
//pubKey is the key (NSData) that I want to store, while tempKeyChain is my keychain
status = SecKeychainItemCreateFromContent(kSecPublicKeyItemClass, &attributes, [pubKey length],(__bridge const void *)pubKey, tempKeyChain, NULL, NULL);
if (status != noErr)
{
NSString *error = (__bridge NSString *)SecCopyErrorMessageString(status, NULL);
NSLog(@"Error in adding item to keychain : %@",error);
return errSecUnimplemented;
}
現在、キーを取得するには、2 つのオプションがあります。OS X 10.7 で廃止され、役に立たない「SecKeychainSearchCreateFromAttributes」、または「SecItemCopyMatching」です。前者は SecKeychainRef パラメーターを受け入れますが、後者は受け入れません。そこで、「SecKeychainSetSearchList」を使用して手動で検索リストを設定し、tempKeyChain を含めてから、「SecItemCopyMatching」を使用しました。そのためのコードは次のとおりです。
OSStatus status;
SecKeychainRef defaultKeychain = nil;
SecKeychainCopyDefault(&defaultKeychain);
NSArray *searchList = [NSArray arrayWithObjects:(__bridge id)defaultKeychain,tempKeyChain, nil];
OSStatus result = SecKeychainSetSearchList((__bridge CFArrayRef)searchList);
if (result != noErr)
{
NSString *error = (__bridge NSString *)SecCopyErrorMessageString(result, NULL);
NSLog(@"Error : %@",error);
return errSecUnimplemented;
}
NSMutableDictionary *query = [[NSMutableDictionary alloc] init];
[query setObject:kSecClassKey forKey:(id)kSecClass];
[query setObject:@"Generic public key" forKey:kSecAttrLabel];
CFTypeRef items;
status = SecItemCopyMatching((__bridge CFDictionaryRef)query, &items);
return status;
キーチェーンがデフォルトの検索リストとともに検索リストに追加されていても、このコードは常に「アイテムが見つかりません」というステータスを示します。
なぜこれが起こっているのか、またはカスタムキーチェーンからキーを保存および取得するための他のより良い方法についてのポインタをいただければ幸いです.
PS - パスワードは保存したくありません。鍵 (公開および秘密) のみを保存します。誰かが私をいくつかのコードに案内したり、同じことを説明する小さなコードスニペットを提示したりできますか? ありがとう。