ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Android] Keystore와 StrongBox의 정의 및 차이점
    테크 2023. 8. 17. 16:45

     

    • 서론
    • Android Keystore
    • StrongBox
    • 요약

     

    서론

    안드로이드에서 암호화 키 보관 방법을 알아보던 중 헷갈리는게 있어서 정리를 해보기로 했다. 이 글을 이해한다면 Hardware-backed 방식을 채택하고 있는 Android Keystore가 무엇인지 최근에 새롭게 생긴 StrongBox는 Android Keystore와 무엇이 다른지 알 수 있을 것이다. 뿐만 아니라 본 내용을 이해하기 위해 필요한 사전 지식인 KeyStore 클래스, MasterKey 클래스, TEE, SE에 대해서도 정리했다.

     

    Android Keystore

    Android Keystore는 무엇인가? Android Keystore는 개발자가 보안성이 높은 어딘가에서 암호화 키를 생성하고 저장하여 디바이스에서 쉽게 접근할 수 없게 만든 시스템이다. 보안성이 높은 어딘가가 어디냐? 바로 신뢰할 수 있는 실행 환경(TEE, Trusted Execution Environment)인 특수 하드웨어이다. 이 하드웨어 내에서만 키가 생성될 수 있다. 또한 메인 OS도 이 공간에 직접 액세스할 수 없다.

     

    * 현재 기준으로 API 18(Android 4.3)부터 Android Keystore와 관련된 API를 사용할 수 있다.

     

    TEE를 모르는 사람을 위해서 잠깐 설명하자면,

    Trusted Execution Environment (TEE)

    TEE는 메인 프로세서의 보안 영역이다. 보안성을 높이기 위해 메인 프로세서 내에 일반 영역과 보안 영역으로 나누고 이 보안 영역을 TEE로 부르는 것이다. TEE는 자체 실행되는 OS가 존재하고, 메인 OS와의 커뮤니케이션은 통제된 인터페이스로만 가능하다. 그 말은 즉슨 메인 OS인 Anroid OS가 손상(compromising)되었다고 하더라도 TEE에는 영향이 가지 않는다. 일반적으로 생체인식 센서의 경우 TEE와 직접적으로 연결되어 있기 때문에 생체인식 데이터는 TEE에만 존재한다.

    KeyStore 클래스

    자, Android Keystore는 Android에서 보안을 위해 지원하는 특별한 시스템이고 KeyStore는 클래스다. KeyStore 클래스를 이용해서 개발자는 암호화 키 및 인증서를 저장할 수 있다. Android는 여러가지의 KeyStore 타입을 제공한다. 그 중 하나가 이전에 설명했던 Android Keystore(AndroidKeyStore 타입)이다. 뿐만 아니라 현재 포스트를 작성하는 시간 기준으로 AndroidCAStore, BKS, BouncyCastle, PKCS12도 있다. 시간이 지날수록 deprecated된 것들이 있을 것이니 꼭 공식 문서를 참고하자.

    MasterKey 클래스

    마스터 키(Master key)는 보안을 강화하기 위해서 하위 키(Sub key)들을 암호화하는 키이다. 공격자가 마스터 키를 추출하면 하위 키들도 노출될 위험이 있기 때문에 마스터 키는 일반적으로 Android Keystore에 저장한다. MasterKey 클래스는 마스터 키의 래퍼이다. 만약 마스터 키가 Android Keystore에 저장되어 있는지 확인하려면 isKeyStoreBacked() 메소드를 호출하면 된다. 뒤에서 설명할 StrongBox에 저장되어 있는지 확인하려면 isStrongBoxBacked() 메소드를 호출하면 된다.

     

    StrongBox

    StrongBox는 Android Keystore에서 좀 더 보안이 강화된 저장소이다. API 28(Android 9) 이상의 Titan M 칩을 가지고 있는 기기에 한해서 암호화 키를 생성하고 저장하는 StrongBox KeyStore API를 사용할 수 있다.

     

    KeyStore 클래스를 사용할 경우 setIsStrongBoxBacked(true) 메소드를 호출하면 StrongBox를 사용할 수 있다. 만약 StrongBox를 사용할 수 없다면 StrongBoxUnavailableException이 발생하니 참고하자.

    Android Keystore와 StrongBox의 차이점

    그러면 "hardware-backed" Keystore인 Android Keystore와 StrongBox는 어떤 차이가 있을까? 앞에서 설명한대로 Android Keystore는 TEE에서 키를 생성/보관을 한다면 StrongBox는 SE(Secure Element인 Titan M 칩)에서 키를 생성/보관한다.

     

    ... SE는 또 뭔데?

    Secure Element (SE)

    TEE는 메인 프로세서 내의 보안 영역을 의미한다면 SE는 이와는 완전히 분리되어 있는 마이크로칩이다. 그렇기 때문에 자체 CPU, 저장소, RAM 등이 존재한다.

     

    요약

    정리하자면 보안성이 더 높은 것은 StrongBox이다. 그렇지만 StrongBox를 지원하지 않는 디바이스가 꽤 많을 것이기 때문에 Android Keystore를 쓰는 것도 보안 관점으로 봤을 때 괜찮다.

    그림은 여기에서 가지고 왔다. 원래 그림에서는 WhiteBox Cryptography(WBC)도 포함이 되어 있지만 설명하기 귀찮아서 지웠다. 그리고 당연히 하드웨어의 지원이 없는 SW-only가 보안성이 낮을 수밖에 없다. 더 자세한 내용을 알고 싶다면 해당 링크를 참고하자.

Designed by Tistory.