(前回)Cocoaの日々: Keychain Services 調査 (7) ドキュメントを読む #5 iPhone補足
Keychain Services Tasks for Mac OS X
Mac Dev Center: Keychain Services Programming Guide: Keychain Services Tasks for Mac OS X
Mac OS X における Keychain Services API の具体的な利用方法について書かれている。
Adding Simple Keychain Services to Your Application
主要 API の基本的な使い方。ソースコードあり。
- 追加:SecKeychainAddGenericPassword()
- 取得:SecKeychainFindGenericPassword()
- 変更:SecKeychainItemModifyAttributesAndData()
ポイントなど。
- SecKeychainFindGenericPassword() で取得したパスワードデータは利用後に SecKeychainItemFreeContent() で開放する必要がある。
- アプリでパスワードのキャッシュをしないこと。別のツールで変更される可能性があるため。
Advanced Topics
Creating a Custom Keychain Item
SecKeychainItemCreateFromContent() を使った keychain item のカスタマイズ方法。label設定の仕方や複数アプリの登録など。
label 設定
- SecKeychainAddInternetPassword() や SecKeychainAddGenericPassword() では自動的にlabelを設定する。
- labelはキーチェーンアクセス.app では「名前」として表示される。
- SecKeychainAddInternetPassword() の場合、例えば URLが http://www.apple.com の場合、"www.apple.com" がlabelとして設定される。
- SecKeychainAddGenericPassword() の場合はサービス名がlabelとして使われる。
- Name(名前)とWhere(場所)の2つの組で識別される。
- URL やサービス名とは違った label を設定したい場合は、SecKeychainItemCreateFromContent() を使う。
- kSecLabelItemAttr が label を表す
信頼されたアプリの複数設定
- SecAccessCreate() で SecAccessRef を用意しておき、SecKeychainItemCreateFromContent()へ渡す
SecAccessCreate() の使い方はこんな感じ ※参考ページから引用して加工
OSStatus err; SecAccessRef access=nil; NSArray *trustedApplications=nil; SecTrustedApplicationRef myself, someOther; err = SecTrustedApplicationCreateFromPath(NULL, &myself); err = SecTrustedApplicationCreateFromPath("/Applications/Mail.app", &someOther); trustedApplications = [NSArray arrayWithObjects:(id)myself, (id)someOther, nil]; err = SecAccessCreate((CFStringRef)accessLabel, (CFArrayRef)trustedApplications, &access);信頼されたアプリの一覧(NSArray)を作っておき、最後にそれを SecAccessCreate() へ渡す。信頼されたアプリは SecTrustedApplicationRef型で表され、SecTrustedApplicationCreateFromPath() で作成する。
Modifying the Access List of an Existing Keychain Item
- 既に存在する Keychain item の Access List の変更の仕方など。
- SecKeychainSearchCreateFromAttributes() と SecKeychainSearchCopyNext() を使い、目的の keychain Item を見つける
- 次に SecKeychainItemCopyAccess() を使い keychain item から access object を取得する
- 次に SecAccessCopySelectedACList() 使い access object から ACL list を取得する(この時に authorization tag として CSSM_ACL_AUTHORIZATION_DECRYPTを指定する)
ポイントは各関数で取得したデータの開放(CFReleaseなど使用)。自動解放されないので要注意。
Servers and the Keychain
- keychain のロックを解除する時に表示されるダイアログ表示を制御する方法について。
- SecKeychainSetUserInteractionAllowed() が使える。
- プログラムでロックを解除するには SecKeychainUnlock を使う。
- SecKeychainSetUserInteractionAllowed() で FALSE(つまりダイアログ非表示)を設定すると、他のアプリケーションも影響をうける。誰かが SecKeychainSetUserInteractionAllowed() で TRUEを呼び出すか、システムをリスタートしない限りはこの影響は続くので取り扱いに注意すること。