iOS의 KeyChain에 대해 느슨하게 정리

KeyChain이란?



자꾸 쓰면
  • 기밀 정보를 안전하게 처리하는 메커니즘
  • 비밀번호, 개인 키 및 공개 키와 같은 기밀 정보를 안전하게 관리하기위한 메커니즘

  • 또한 KeyChain에서 관리하는 정보는 암호화되어 있습니다.
    사용자의 정보를 보존하는 구조로서 UserDefaults 가 있습니다만, 이것은 설정 파일등의 preference 정보를 관리하기 위한 구조.

    UserDefaults와의 차이


  • 앱이 삭제 되더라도 데이터가 남아 있습니다
  • 같은 Keychain Access Group에 속하는 앱끼리 액세스할 수 있습니다
  • 데이터가 암호화됩니다

  • 준비



    프로젝트 만들기





    Framework 추가




    Linked Frameworks and Libraries 에서 Security.framework 를 추가합니다.

    라이브러리 설치



    이번에는 KeyChain의 편리한 라이브러리를 사용합니다.

    TheLevelUp/LUKeychainAccess

    Podfile
    pod 'LUKeychainAccess', '~> 1.2'
    
    $ pod install
    $ open PROJECT_NAME.xcworkspace/
    

    KeyChain 준비







    KeyChain Group은 내 경우에는 moe.nnsnodnb.*의 앱간에 협력 할 수 있습니다.
    Google이 출시된 앱은 이 KeyChain Group을 사용하여 처음 로그인한 이후 자동으로 로그인할 수 있게 되어 있지 않습니까?

    준비는 일단 완료! !

    액세스 제어



    KeyChain은 앱을 삭제해도 데이터가 남아 있다고 하는 것으로 액세스 제어가 Accessible属性 로서 존재하고 있습니다.
    이번은 LUKeychainAccess 에 구현되고 있다 Accessible属性

    Accessible 속성
    개요


    LUKeychainAccessAttrAccessibleAfterFirstUnlock
    재부팅 후 첫 번째 잠금 해제 이후/다음 재부팅까지

    LUKeychainAccessAttrAccessibleAfterFirstUnlockThisDeviceOnly
    재부팅 후 첫 번째 잠금 해제 이후/다음 재부팅까지

    LUKeychainAccessAttrAccessibleAlways
    항상 액세스 가능

    LUKeychainAccessAttrAccessibleAlwaysThisDeviceOnly
    항상 액세스 가능

    LUKeychainAccessAttrAccessibleWhenUnlocked
    장치가 잠금 해제된 상태

    LUKeychainAccessAttrAccessibleWhenUnlockedThisDeviceOnly
    장치가 잠금 해제된 상태


    같은 느낌

    주의


  • 시뮬레이터에 의한 빌드는 시뮬레이터에 의한 그룹의 취급이 모두.
  • Debug 용 빌드 나 AdHoc 용 빌드 등에서는 test가 다르기 때문에 KeyChain 액세스를 앱간에 할 수 없습니다

  • 소스 코드



    이번에는 버튼을 누르면 "고이즈미 하나요 짱"이라는 문자가 출력되는 것을 만들었습니다.

    ViewController.m
    #import "ViewController.h"
    #import <LUKeychainAccess/LUKeychainAccess.h>
    
    @interface ViewController ()
    
    @property (weak, nonatomic) IBOutlet UILabel *label;
    - (IBAction)callKeyChain:(id)sender;
    
    @end
    
    @implementation ViewController
    
    - (void)viewDidLoad {
        [super viewDidLoad];
        LUKeychainAccess *keychainAccess = [LUKeychainAccess standardKeychainAccess];
        keychainAccess.accessibilityState = LUKeychainAccessAttrAccessibleWhenUnlocked;
        [[LUKeychainAccess standardKeychainAccess] setString:@"小泉花陽ちゃん" forKey:@"rice"];
        self.label.hidden = YES;
    }
    
    - (void)didReceiveMemoryWarning {
        [super didReceiveMemoryWarning];
    }
    
    - (IBAction)callKeyChain:(id)sender {
        self.label.hidden = NO;
        self.label.text = [[LUKeychainAccess standardKeychainAccess] stringForKey:@"rice"];
    }
    
    @end
    

    실행 샘플







    다양한 유형을 KeyChain에 관리




    TestKeyChain.m
    #import <XCTest/XCTest.h>
    #import <LUKeychainAccess/LUKeychainAccess.h>
    
    @interface sample_keychainTests : XCTestCase
    
    @end
    
    @implementation sample_keychainTests
    
    - (void)setUp {
        [super setUp];
        // integer
        [[LUKeychainAccess standardKeychainAccess] setInteger:1 forKey:@"integerKey"];
        // float
        [[LUKeychainAccess standardKeychainAccess] setFloat:1.0 forKey:@"floatKey"];
        // double
        [[LUKeychainAccess standardKeychainAccess] setDouble:1.0 forKey:@"doubleKey"];
        // BOOL
        [[LUKeychainAccess standardKeychainAccess] setBool:YES forKey:@"boolKey"];
        // NSString
        [[LUKeychainAccess standardKeychainAccess] setString:@"string" forKey:@"stringKey"];
        // NSObject
        [[LUKeychainAccess standardKeychainAccess] setObject:@"object" forKey:@"objectKey"];
    }
    
    - (void)tearDown {
        [super tearDown];
    }
    
    - (void)testKeyChain {
        XCTAssertEqual([[LUKeychainAccess standardKeychainAccess] integerForKey:@"integerKey"], 1);
        XCTAssertEqual([[LUKeychainAccess standardKeychainAccess] floatForKey:@"floatKey"], 1.0);
        XCTAssertEqual([[LUKeychainAccess standardKeychainAccess] doubleForKey:@"doubleKey"], 1.0);
        XCTAssertEqual([[LUKeychainAccess standardKeychainAccess] boolForKey:@"boolKey"], YES);
        XCTAssertEqualObjects([[LUKeychainAccess standardKeychainAccess] stringForKey:@"stringKey"], @"string");
        XCTAssertEqualObjects([[LUKeychainAccess standardKeychainAccess] objectForKey:@"objectKey"], @"object");
    }
    
    @end
    

    참고

    좋은 웹페이지 즐겨찾기