안드로이드 키스토어 시스템을 이용한 암호화 키 관리

  • TEE 및 StrongBox와 같은 보안 하드웨어에 저장하여 암호화 자료를 보호합니다.
  • 사용자 인증 및 유효 기간에 기반한 사용 제한 구현.
  • 전역 자격 증명용 KeyChain API와 개별 앱용 Android Keystore 제공자 간의 기술적 차이점.
  • Keymaster에서 최신 안드로이드 버전의 KeyMint 구현에 이르기까지 시스템의 아키텍처적 진화.

안드로이드 키스토어 시스템을 이용한 암호화 키 관리

오늘날 우리의 모바일 기기는 은밀한 사진부터 신용카드 정보까지 모든 것을 저장하는 사실상의 일기장과 같습니다. 그렇기 때문에 보안을 소홀히 할 수 없습니다. 안드로이드에서 민감한 데이터를 보호하는 데 있어 안드로이드 키스토어 시스템은 악의적인 공격자가 암호화 키를 탈취하는 것을 막는 핵심 도구이며, 안드로이드 보안 의 필수적인 요소입니다.

기본적으로 이 시스템은 디지털 금고와 같습니다. 보안상 매우 취약한 일반 텍스트 파일로 휴대전화 저장소에 키를 저장하는 대신, 안전한 컨테이너 에 키를 보관합니다 . 무엇보다 좋은 점은 키가 이 컨테이너 안에 보관되면 암호화나 서명 등에 사용할 수 있지만, 운영체제가 손상되더라도 기기에서 키 를 추출할 수 없다는 것입니다.

시스템의 핵심에서 보안은 어떻게 작동합니까?

키스토어는 키 데이터를 두 가지 명확한 방식으로 안전하게 보호합니다. 첫째, 애플리케이션 프로세스를 통한 키 데이터 추출을 차단하여 기기 외부에서 키 데이터를 탈취하는 것을 방지합니다 . 둘째, 누군가 시스템에 접근하더라도 마음대로 키를 사용할 수 없도록 합니다. 앱은 시스템이 엄격하게 시행하는 승인된 사용 용도를 정의해야 합니다.

안드로이드는 이러한 보안을 진정으로 강화하기 위해 하드웨어에 의존합니다. 핵심 데이터는 앱 프로세스를 거치지 않고, 작업을 수행해야 할 때 특수 시스템 프로세스 로 전송됩니다 . 또한 최신 스마트폰의 경우, 키는 TEE(Trusted Execution Environment) 또는 SE(Secure Element)에 연결됩니다. StrongBox가 탑재된 기기의 경우 , 이 모듈은 자체 CPU, 안전한 저장소, 그리고 실제 난수 생성기를 갖추고 있어 물리적 공격에도 견딜 수 있으므로 보안 수준이 한 단계 더 높아집니다.

하드웨어로 보호되는 키의 여부를 확인하려면 Android 10 이상에서 개발자는 `getSecurityLevel()` 함수를 사용할 수 있습니다 . 결과가 `TRUSTED_ENVIRONMENT` 또는 `STRONGBOX` 이면 해당 키가 메인 프로세서와 격리된 영역에 있다고 확신할 수 있습니다.

Android System Key Verifier-5란 무엇인가요?
관련기사:
Android 시스템 키 검증 도구: Android 시스템 키 검증 도구란 무엇이고, 어떤 기능을 하며, Android 보안에 어떤 영향을 미치는지 알아보세요.

접근 제어 및 사용 권한 부여

이 시스템의 가장 큰 장점 중 하나는 키를 생성할 때 각 키에 "규칙"을 지정할 수 있다는 것입니다. 이러한 규칙은 한 번 설정하면 변경할 수 없습니다 . 예를 들어, 특정 알고리즘 (예: AES 또는 RSA) 에서만 작동하도록 키를 제한 하거나 키의 유효 기간을 정확하게 정의할 수 있습니다.

하지만 가장 강력한 것은 바로 이것입니다. 사용자 인증사용자가 최근에 PIN, 패턴 또는 기타 방법으로 인증한 경우에만 키가 작동하도록 구성할 수 있습니다. 생체 인식(지문 또는 얼굴)), 다음을 고려하면 2D vs 3D 얼굴 잠금 해제 이 시스템은 다양한 수준의 보호 기능을 제공합니다. 두 가지 모드가 있는데, 하나는 인증 후 일정 시간 동안 모든 키에 대한 권한을 부여하는 모드이고, 다른 하나는 더 엄격한 모드입니다. 모든 암호화폐 작업 개별적으로 승인을 받아야 합니다. BiometricPrompt.

키체인 vs. 안드로이드 키스토어 제공업체

어떤 방식을 선택해야 할지 고민될 때가 있습니다. 시스템 전체에 적용되는 자격 증명이 필요할 때는 키체인 API가 이상적인 옵션입니다. 사용자는 시스템 인터페이스를 통해 어떤 자격 증명을 앱과 공유할지 직접 선택할 수 있습니다. 이는 모바일 기기 소유자의 명시적인 동의가 있는 경우 여러 애플리케이션 간에 자격 증명을 공유 할 때 매우 유용합니다.

모바일에서 비밀번호 관리
관련기사:
Android에서 비밀번호 관리 및 보호를 위한 완벽한 가이드: 보안, 앱 및 필수 팁

또한, 안드로이드 키스토어 제공자 각 애플리케이션이 자체 키를 비공개로 관리하도록 설계되었습니다. 이는 다음과 같은 경우에 권장되는 옵션입니다. 당신의 앱만 사용자가 목록에서 키를 수동으로 선택할 필요 없이 비밀 키에 접근할 수 있도록 합니다. 이를 구현하기 위해 표준 Java 클래스가 사용됩니다. KeyStore, KeyPairGenerator o KeyGenerator.

기술적 구현: 암호화 및 서명

안드로이드 키스토어 시스템을 이용한 암호화 키 관리

대칭 데이터 암호화에는 AES-GCM이 가장 권장되는 방법입니다 . 이 방법은 비밀성을 유지할 뿐만 아니라 암호화된 바이트가 변조되었는지 여부를 감지하여 데이터 무결성을 보장합니다. 각 연산은 고유한 초기화 벡터(IV)를 생성하며, 이 IV 는 연산을 되돌리기 위해 암호화된 데이터와 함께 저장되어야 한다는 점을 기억하는 것이 중요합니다.

디지털 서명이 필요한 경우 RSA를 사용하는 것이 가장 좋습니다 . 키 저장소 내에서 공개 키와 개인 키 쌍이 생성됩니다. 개인 키는 정보를 서명하기 위해 안전한 하드웨어에 보관되며 , 공개 키는 메시지가 변조되지 않았고 원래 발신자로부터 온 것임을 확인하기 위해 배포될 수 있습니다.

몹에프
관련기사:
MobSF 프레임워크: Android, iOS 및 Windows 모바일 애플리케이션을 위한 포괄적인 보안 분석

시스템의 내부 아키텍처 및 진화

시스템의 내부 구조는 매우 복잡합니다. 안드로이드키스토어 앱의 눈에 보이는 부분이지만, 실제로는 앱과 소통하는 역할을 합니다. 키스토어 데몬 Binder를 통해 관리됩니다. 이 데몬은 다음을 관리합니다. keyblobs (암호화된 키)를 사용하며, 다음 사항에 의존합니다. KeyMint의 HAL (이전 명칭: Keymaster) 보안 분야에서 중요한 역할을 수행합니다.

안드로이드 6.0에서 접근 제어 및 AES/HMAC 기본 요소가 도입된 것을 시작으로, 키 인증 및 버전 연동(공격자가 취약한 버전으로 OS를 다운그레이드하는 것을 방지하기 위해)이 추가된 안드로이드 7.0을 거쳐 안드로이드 12에 이르기까지 긴 여정을 걸어왔습니다. 최신 버전인 안드로이드 12에서는 보안 강화를 위해 데몬이 Rust 로 재작성되었으며, ECDH 키 합의 및 키 사용 제한을 지원하는 KeyMint의 HAL이 도입되었습니다.

법의학적 관점 및 추출 위험

키 저장소는 매우 안전하지만, 컴퓨터 포렌식 분야에서는 정보를 추출하려는 시도가 있을 수 있습니다. 키는 암호화된 상태로 저장됩니다. /misc/keystore/ (또는 Android 12부터는 SQLite 데이터베이스에 저장됩니다). 이를 보호하기 위해, 키 암호화 키(KEK) 보안 하드웨어의 고정 값에서 파생됩니다.

일부 디지털 포렌식 전문가들은 프로세서별 취약점(예: MTK 또는 Qualcomm)을 통해 하드웨어 값을 추출하여 오프라인 복호화를 시도합니다. 만약 KEK(키스토어 키)를 획득하는 데 성공하면 키스토어에 저장된 키를 복호화하여 Signal이나 Element 와 같은 애플리케이션의 암호화된 데이터베이스에 접근할 수 있습니다 . 이러한 애플리케이션들은 일반적으로 키스토어를 사용하여 Realm 데이터베이스의 마스터 키를 보호합니다.

보안 모바일
관련기사:
Android용 최고의 보안 앱: 완전 업데이트 가이드

Google에서 선호하는 검색 엔진으로 추가