Touch ID: 개인 키 보호 Touch ID

13642 단어 iOSC#TouchIDJose
JwkSet 관리 어플의 만능 열쇠를 사용하고 싶어요.

SecKind.GenericPassword로 저장

  • 안녕하세요.키라면 잘 안 돼.
  • 
            const SecKind KIND =  SecKind.GenericPassword;
            public static readonly string SERVICE_NAME = "Auth.Touch";
    

    만능 열쇠가 있으면 삭제합니다.

  • KeyChain Item 쿼리 레코드
  • 
            static readonly SecRecord KEYCHAIN_QUERY = new SecRecord (KIND) {   
                Service = SERVICE_NAME,
                UseOperationPrompt = "Authenticate yourself.",
            };
    
  • 지정된 KeyChain Item 제거
  • 
            public override void Delete ()
            {
                Evaluate (SecKeyChain.Remove (KEYCHAIN_QUERY));
            }
    
  • Success가 아닌 경우 예외
  • 
            public static void Evaluate(SecStatusCode  code){
                if (code != SecStatusCode.Success) {
                    throw new KeyChainException (code);
                }       
            }
    

    진지하게, JOSE JwkSet.

  • JwkSet을 엄격히 하고 SecRecord를 투입한Generic
  • 리뷰와 같이 터치 ID로 보호하려면 SecAccess Controll
  • 을 설정합니다.
  • Access Control을 지정하지 않으면 터치 ID에 대한 프롬프트가 아닙니다
  • .
    
            public static SecRecord ToKeyChainItem (
                Jose.JwkSet jwkset, 
                SecAccessControl grant)
            {
                // if AccessControl is not specified,
                // this security record is not protected by TouchID 
    
                return new SecRecord (KIND) {
                    Service = SERVICE_NAME,
                    Generic =  NSData.FromString(jwkset.ToJson()),
                    UseNoAuthenticationUI = true,
                    AccessControl=grant,
                };          
            }
    
  • 터치 ID에 사용된 Access Control은 다음과 같다
  • 
            static readonly SecAccessControl GRANT = new SecAccessControl (
                                                         SecAccessible.WhenPasscodeSetThisDeviceOnly,
                                                         SecAccessControlCreateFlags.UserPresence);
    
    
  • 제작.Delete의 예외는 ItemNotFund에서 무시됩니다.
  • 
            public override Jose.JwkSet Create ()
            {
                try{
                    this.Delete ();
                }catch(KeyChainException ex) {
                    if (ex.Code != SecStatusCode.ItemNotFound)
                        throw ex;
                }
                return this.Add (CreateJwkSet());
            }
    
  • Add
  • 
            public Jose.JwkSet Add(Jose.JwkSet jwkset)
            {
                var kci = ToKeyChainItem(jwkset, GRANT);
                Evaluate (SecKeyChain.Add (kci));
    
                return jwkset;
            }
    
  • JwkSet의 경우 EC521
  • 
            public static Jose.JwkSet CreateJwkSet()
            {
                var jwk = Jose.Jwa.KeyDef.EC.GenerateKey (Jose.Jwa.Ec.CurveEnum.P_521);
                jwk.kid = DateTime.Now.ToString (); // for TEST
    
                return new Jose.JwkSet () {
                    keys = new System.Collections.Generic.List<Jose.Jwk>{ jwk }
                };
            }
    

    참조

  • Delete와 동일한 KeyChain Item
  • 을 기록하고 찾기
  • 찾은 후 JwkSet
  • 으로 복원
    
            public override Jose.JwkSet Load ()
            {
                SecStatusCode code;                
    
                SecRecord resultData = SecKeyChain.QueryAsRecord (
                    KEYCHAIN_QUERY, out code);
                Evaluate(code);
                return ToJwkSet(resultData.Generic);
            }
    

    이동

  • 시작
  • 빈 삭제 시 예외
  • 새로 만들기 & 저장
  • 조회 시 터치 ID 인증
  • 인증이 통과되면
  • 참고로 "Enter Passcord"도 비밀번호 인증
  • 가능

    SecKind.케이면 잘 안 돼.


    터치 ID를 사용하지 않는 경우 다음 코드 SecKind를 사용합니다.Key로 저장할 수 있지만 터치 ID를 보호하면 Param 오류
    
    
                SecStatusCode code = SecKeyChain.Add ( new SecRecord ( SecKind.Key ) {
                    Service = _service_name,
                    Label = _service_name,
                    Account = _account_name,
                    Generic = NSData.FromString ( jwkset.ToJson(), NSStringEncoding.UTF8 ),
                    Accessible = accessible,
                    Synchronizable = sync
                } );
    
  • 어떤 Param의 오류인지 몰라
  • 좋은 웹페이지 즐겨찾기