SSKeychain を使って Keychain Service にパスワードを保存したみた

例えば、Web サービスの iPhone クライアントの場合、ユーザーに Web サービスのアカウント名とパスワードを入力してもらう必要がある。で、入力してもらったパスワードを安全に保存しなきゃいけないんだけど、嬉しいことに iOS は Keychain Service というパスワードを安全に保存できる仕組みを提供している。

ただ、上記ページを見れば分かる通り、Keychain Service を素で扱うと長ったらしいコードを書かないといけない。ライブラリを使った方がいいね、これ。Google 先生に質問してみたらいくつか教えてくれたんで、その中から CocoaPods に対応しているという理由で、SSkeychain を使うことにした。

CocoaPods に対応しているので、まずプロジェクトの Podfile に

pod 'SSKeychain'

を追加し、

pod install

を実行するだけでインストールが完了する。

あとは、Keychain Service にパスワードを保存したり、逆にパスワードを取り出したりするコードを書くだけ。

#import <SSKeychain/SSKeychain.h>
#import "Setting.h"

@implementation Setting

...

// Keychain Service からパスワードを取得する
+ (Setting *)loadSetting:(NSError**)error
{
    Setting *setting = [[Setting alloc] init];
    setting.account = [[NSUserDefaults standardUserDefaults] stringForKey:@"account"];
    
    setting.password = [SSKeychain passwordForService:@"MyService"
                                              account:setting.account
                                                error:error];
    
    return setting;
}

// Keychain Service にパスワードを保存する
+ (void)saveSetting:(Setting *)setting error:(NSError**)error
{
    [[NSUserDefaults standardUserDefaults] setValue:setting.account forKey:@"account"];
    
    [SSKeychain setPassword:setting.password
                 forService:@"MyService"
                    account:setting.account
                      error:error];
}

...

@end

パスワードを取り出すのにアカウント名が必要なので、アカウント名は Keychain Service ではなく NSUserDefaults に保存している。アカウント名もどうにかして Keychain Services に保存したほうがいいのかな。