2012年1月27日

キーチェーンアクセス

なんかこれも意外と面倒。こちら↓
http://log.scifihifi.com/post/55837387/simple-iphone-keychain-code

で提供されている、SFHFKeychainUtils.hとmを使えば簡単ということなんだけど、これまたARC対応じゃないんだこれが・・・orz
いろいろ対処法があるんだろうと思うんですが、面倒なので急がば回れでちまちま治しました。
基本的に、release]やらautorelease]をどんどん消していって、Xcodeの◎を押して勝手に直させればいいんだけれど、最後、ポインターのポインターがダメ?

error: cast of an indirect pointer to an Objective-C pointer to 'CFTypeRef *' (aka 'const void **') is disallowed with ARC [4]
が少し悩んだ。 が、ここ↓
http://stackoverflow.com/questions/7827730/iphone-fetch-data-dictionary-from-keychain
を見て治しました。 すごいなあ。

CFDictionaryRef cfresult = NULL;
NSMutableDictionary *attributeQuery = [query mutableCopy];
[attributeQuery setObject: (id) kCFBooleanTrue forKey:(__bridge id) kSecReturnAttributes];
OSStatus status = SecItemCopyMatching((__bridge CFDictionaryRef) attributeQuery, (CFTypeRef *) &cfresult);

って感じで。
resultDataんとこは要るみたいなのでSecItemCopyMatchingの後で、

NSData *resultData = (__bridge_transfer NSData *)cfresult2;

って感じ。
cfresult2 は、CFDataRefです。

「って感じ」ばっかりだけど、とりあえず大丈夫っぽい。

しかし、どうなんだろう???このkeychainアクセス。
forServiceNameが自由に設定できるところが、セキュリティーとしてはやや弱いように思えるんだが・・・
もちろん、平文でNSUserDefaultsにパスワード保存がマズイのはわかるが、破り方によってはNSUserDefaultsよりも怖い気がする。

一応、forServiceNameは安易なアプリ名にしないほうが良いと思うのですが、あんまり書いてあるとこ無いので、書いとこうと思いました。

まあきっと僕がよくわかっていないのだろう。 推奨の方法なのでヨシとしよう。


1 件のコメント:

  1. 同様の問題で困っていたところを、本記事のおかげで解決できました! ありがとうございます。

    返信削除