메시지 인증 코드(Message Authentication Code, MAC)는 메시지의 인증에 쓰이는 정보(코드)이다. 메시지의 무결성 및 신뢰성을 보장하는 용도로 MAC을 사용한다.
무결성이란, 서버 입장에서 클라이언트로부터 API 요청을 받았을 때, 이 요청이 신뢰할 수 있는 것인지 (정보가 중간에 변경없이 그대로 전달된 것인지)에 대한 성질을 말한다.
HMAC은 인증을 위한Secret Key와 임의의 길이를 가진Message를 해시 함수(알고리즘)을 사용해서 생성한다. 해시 함수로는 MD5, SHA-256과 같은 일반적인 해시 함수를 그대로 사용할 수 있으며 각 알고리즘에 따라 다른 고정길이의 MAC(Hash value)가 생성된다.
- Secret Key: 서버와 클라이언트가 함께 알고 있는 외부로 유출되어서는 안되는 값.
- Message: 클라이언트가 전송하는 요청의 전체(Header + Body)가 될 수도 있고, URL만 될 수도 있다.
여기까지가 일반적인HMAC에 대한 정의이고, 위의 내용만 보면 이해가 쉽지 않아 아래에 좀 더 쉽게 설명하자면,
HMAC은 해싱기법을 이용해서 메시지의 위변조가 있었는지 체크하는 인증 기법이다.
해싱 자체는 원문 메시지를 일정한 길이의 다른 메시지로 변환하되, 일정 길이로 떨어지게 하는 기법. 원문을 해싱하여 나온 메시지를다이제스트 라고 한다.
해싱의 결과는 유일하고(즉, A를 언제든 같은 해싱 기법으로 변환하면 항상 A' 가 된다), 해싱을 풀어 원문을 찾아낼 수 없다는 것이 장점.
HMAC으로 메세지 위변조 감지 절차
1. 메시지 보내는 쪽과 받는 쪽을 가정하고 이 둘은 두 가지를 공통적으로 알고 있어야한다.키 그리고어떤 HMAC 알고리즘 사용할지.(HMAC의 종류가 다양하므로) HMAC-SHA256 알고리즘을 사용한다고 가정한다면(그림에서 HMAC-SHA256 알고리즘은 암호화 알고리즘이 아님)
2. 보내는 쪽에서 보내고 싶은 내용이 있고, 그리고공통의 KEY(SecretKey)가 있다. 이를 사용해서 보내는 쪽에서시그니처 Signature라는 것을 생성하는데, 이 값은 메시지의hash 값이다. KEY와 내용을 HASH 알고리즘에 적용하면,시그니처가 생성된다.
3. 받는 쪽에서도KEY(SecretKey)를 알고 있고알고리즘도 알고 있다. 받는 쪽에서도 똑같이Signature를 만든 후, 이를 받은Signature와 맞는지 검증한다.
4. 중간에 메시지가 위조되었다면,"보낸 시점의 메시지와 받은 시점의 메시지가 다르니까 signature도 다르게 나올것이다." 라는 것이 HMAC의 컨셉이다.만약 signature까지 위조하려고 해도, 위조자는 KEY 값을 모르니까 위조할 수 없다는 점이 HMAC의 장점.
HMAC-SHA256에서 SHA-256은?SHA- 시리즈들은 Secure Hash Algorithm 이라는 이름으로, 해시 알고리즘의 종류들을 말한다. SHA-1, SHA-2 .. 등이 있는데, 중간에 모든 숫자가 있는 건 아니다. SHA-2 는 다이제스트의 길이가 다양한데, 이 중 다이제스트의 길이가 256byte인 것을SHA-256이라고 한다.
Android 에서 사용하는 WhiteBox라고 불리는 것은 무엇이며, 어떻게 동작, 사용하는지 알아봅시다.
먼저 WhiteBox에 대해 알아보기 전에 암호키 탈취 공격 유형에는 어떠한 것들이 있는지 알면 좋습니다.
암호키 탈취 공격의 유형
먼저 암호키를 탈취하려는 공격 기법을 보면, 아래 3가지 기법으로 구분하고 있다
Black-box(블랙박스) 공격 : 암호문과 평문을 가지고, 비대칭알고리즘인 경우는 공개키(Public-key)를 가지고,암호키(Secret-key 또는 Private-key)를 유추해 내는 공격이다. 즉 암호 알고리즘이 동작되는 내부 정보 및 과정을 볼 수 없기 때문에 Black-box란 용어를 사용한다. 보안 강도는 사용되는 "암호 알고리즘"과 "암호키 길이"에 따라 결정되어지는데, 이 경우는 높은 성능을 가진 컴퓨터를 사용하여 암호키를 유추해 내기 때문에절대적인 시간이 필요하다. 물론 힌트가 되는 정보(오랜 시간 관찰하면 pattern을 알 수 있다고 함)를 입수하면, 계산 시간이 단축되지만 이러한 공격에 대비하는 방법은주기적으로 암호키를 변경하는 것이다.
Gray-box(그레이박스) 공격 :암호 연산 시 발생되는 부가적인(Side) 정보 즉 소요 시간, 전력 사용 패턴, 발생되는 전자기파 정보 등을 입수하여암호키를 유추하는 공격이다. 이러한 공격을Side Channel(부채널) 공격이라고도 부르는데, 공격을 방지하기 위해서, 물리적으로 부가적인 정보가 유출되지 않도록 방지하는 기법과, 부가적인 정보가 유출되더라도 암호 알고리즘 상에서 암호키를 유추하지 못하도록 구현하는 기법을 사용한다. 암호 알고리즘 상에서 Side Channel 공격을 방지하는 기능을 구현한 알고리즘을 "Side Channel 내성 암호 알고리즘"이라고 부른다. 메모리를 얼려서 암호키를 알아내는 공격인, Cold Boot Attack 도 Side Channel 공격의 한 종류로 분류하고 있다.Gray-box란 Black-box 와 White-box 의 중간 단계에 속한다는 의미이다.
White-box(화이트박스) 공격 : White-box란 용어가 내포하듯이암호 연산 과정을 들여다 보면서 공격을 한다는 의미이다. emulator 등의 software 분석 tool을 사용하여, 메모리 정보나 동작 과정 정보 등을 알아내어 암호키를 찾아낸다. 예를 들면, 암호키를 사용하는 특정 Application 이나 시스템을 입수하여, 자신의 분석 환경에서 디버깅 기법이나 리버스 엔지니어링(Reverse Engineering) 기법으로 암호 연산 과정을 추적하여 암호키를 찾아내는 방식이다. White-box 공격 과 Total-access 공격은 같은 의미가 된다.
Black-box 공격의 어려움(난이도)를 알기 때문에, 암호키 탈취를 목표로 하는 공격자는, Gray-box 공격이나 White-box 공격을 시도하는 것이다. White-box 공격을 하기 위해서는, 백도어 기능을 가진악성코드(Malware)를 사용자 시스템에 몰래 설치하여 실행시키거나, 암호키 정보를 가지고 있는디바이스를 훔치는 것 등의 방법을 사용한다.
White-box 공격을 방지하기 위한 Solution
White-box 공격을 방지하기 위한 대응 Solution으로 나온 것이 HSM(Hardware Solution) 과 WBC(White Box Cryptography)(Software Solution) 이다.
Application을 개발하는 입장에서 보면, 동작되는 시스템에서 HSM기능(TPM module 이나 TEE 지원 등) 지원 여부에 따라, 암호키 보관 기능을 구현해야 한다. HSM 기능이 없다면, password방식의 암호기능이나 난독화 기능을 사용하여, 암호키가 평문으로 노출되는 것을 방지해야 한다.
WBC(White Box Cryptography)는 Software 방식, 즉 암호키가 노출되지 않고 암호 함수 속에 들어가 동작되기 때문에, Application 개발자에겐, Hardware Independent한 매력적인 Solution으로 여겨지고 있다.
Hardware Solution : HSM
HSM(Hardware Security Module)은 단어가 의미하듯이 Hardware 적인 장치를 사용하여 암호키를 특별하고 안전한 장소에 보관하는기능을 가진 Module 이다. HSM의 모양은 구현 기능과 방식에 따라 다양한데, "IC Card(스마트카드)", "USB 디바이스", "PCI Card", "Network I/F를 가진 독립된 장비" 등 다양하다. 국내에선 HSM을 "보안 하드웨어"라고도 부른다.
HSM 기능이 내장되어 시장에 판매되고 있는 제품으론, TPM(Trusted Platform Module)을 장착한 노트북PC 와 TEE(Trusted Execution Environment) 나 SE(Secure Element)기능을 내장한 스마트폰이 있습니다(참고로, TEE는 안드로이드 OS 4.3버전부터 지원하고 있으며, 9.0버전부터는 SE 기능도 지원하고 있다. 안드로이드의 "Android KeyStore 와 Android Keystore"가 대표적이다).
보다 자세한 내용은 KeyStore 에서 다룰 예정으로 Skip하겠다.
Software Solution : White Box Cryptography
White Box Cryptography(화이트박스 암호)는암호알고리즘이 동작되는 platform이 open-platform이라는 가정하에, 즉 누구나 접근할 수 있는 환경하에서, 암호기능(암호화 및 복호화)를 수행할 수 있도록 개발된 암호기술이다. 사용자 관점에서 본 open-platform이란, 공격자 입장에서 보면 White Box 공격을 할 수 있는 환경이 된다.
WBC(White Box Cryptography)가 구현이 되어 있으면, 사용자가 암호기능이 수행되는 디바이스를 분실했더라도, 또는 해커가 몰래 침투해 있더라도, 암호키가 유출되지 않는다는 것이다. 또한 HSM 사용시, 비용의 증가 및 구현(디바이스 내부에 HSM기능 구현)의 난이도가 있는 반면, WBC는 Software만으로쉽게 구현되며, patch 또는 Upgrade도 쉽게 되는 장점이 있다.
요약하면,WBC는 White-box 공격이 있는 상황에서도 암호 정보(암호키 및 Salt 정보)를 안전하게 지키는 목적으로 개발된 암호 기술이다. 암호키가 외부 입력 값으로 들어가지 않고 암호 함수 속에 섞여 있는 이러한 상태를 obfuscation이라고 부른다.
WBC는 기존 표준화된 암호 알고리즘과 경쟁 상태에 있는 기술이 아니라, 표준화된 암호 알고리즘을 사용하면서 암호키가 노출되지 않도록 보완하는 기법이다. 즉 사용되는 암호키를 software적으로 보다 안전하게 보호하기 위하여 개발된 암호 기술이다.
WBC에 대한 기본적인 개념을 먼저 설명하면, 암호 함수 code 와 암호키를 무작위로 섞어서 혼잡된(obfuscated) 새로운 code를 generate(생성)하여 사용하는 기법이다. 제안되었을 당시는 Table들을 사용하여 mapping하는 방식을 사용하였으나, 그 후 table 없이 code만으로 동일한 보안 강도를 구현하는 방식도 개발되었다. 새롭게 생성된 code는 동일한 암복호화 기능을 수행하게 된다. 즉,암호키가 노출되지 않는 상태로 암복호화 기능이 수행된다. 생성된 새로운 code는 "WB 암호 함수 code" 라고 부르고, 아래 그림은 기본적 개념을 표시한 것입니다.
처음에 나온 "original white-box AES" 의 내부 구현 방식은 key-dependent table들을 사용하여 mapping하는 것인데, 무작위(random) bijection 방식으로 인코딩된 Table들을 lookup(조회 또는 검색)하는 방식으로 AES를 구현하였으며, table들 안에 암호키 정보를 숨겨 두었다. 즉,Table 전체가 암호키 역할을 하는 것이다.
하지만 이 방식은 나오자마자 공격자들에 의해서 break되었다. 그래서 현재는 이 방법은 사용하지 않고 좀 더 해독하기 어려운 WBC solution이 나오기 시작했다. 상용화된 WBC solution은, WB Engine을 사용하여 암호키를 해독하기 어려운 size가 큰 "protected key"로 변환시키는 기법을 사용한다. 현재 판매되고 있는 WBC Solution에 대해서는 아직 break 되었다는 보고는 없다.
상용화되는 WBC의 개념
WBC가 제안되었을 당시는 암호키가 고정된 것으로 간주 했다. 즉 "protected key"가 WBC 암호 함수 속으로 들어갔습니다. 하지만 산업계에선 "protected key"를 변경할 수 있도록 즉 외부 입력 값으로 할 수 있기를 원하기 때문에, 암호키가 동적으로 변경되는 경우에 대한 WBC 구현 방식도 개발되었다.
WBC의 단점
- 동작되는 code 전체를 copy하면, 다른 디바이스에서 암호키를 몰래 암복호화 기능이 동작되므로, code가 주어진 device에서만 동작되도록 하는 기법(node-locking 기법)도 함께 적용되어져야 한다.
- 큰 size를 차지하는 Table 또는 protected key를 사용하기 때문에많은 양의 메모리를 필요로 하고,암복호화 속도가 상대적으로 느리다.
참고로, 암호키를 password 방식으로 암호화시켜 파일(file)로 저장하는 것은, HSM 방식도 아니고 WBC 방식도 아니다. 따라서 공격자는, 암호키 파일을 입수한 후에는, Black-box 공격으로 password를 알아내면 된다. Password를 알아내는 것은 암호키를 알아내는 것과 비교할 수 없이 난이도가 쉽다. Password를 알아내면 암호키를 사용할 수 있는 상태가 된다.
KeyStore 와 Keystore 는 한글로 읽으면 둘 다 '키스토어'이기 때문에, 동일한 단어로 들리지만, 실제로 다른 의미를 가지고 있다.
Android KeyStore Service
안드로이드 앱을 Google Play에 배포하기 위해서는 해당 앱을 서명하여 생성한 APK를 업로드하여 배포해야 하는데, 이 때, 서명에 사용되는 키 및 키저장소를 KeyStore라 한다.
해당 KeyStore는 AndroidStudio tool에서 생성 할 수 있으며, Google Play에 배포를 하게되면 같은 패키지로 업데이트를 진행 할 때, 반드시최초에 APK를 서명했던 키스토어로 서명한 APK를 업로드 해야합니다.
만약, 최초에 서명한 키스토어를 잃어버렸다면 구글에게 메일을 보내 처리할 수는 있지만 까다롭기에 안잃어버리게 잘 관리하는 것이 중요!잃어버렸을 경우 : https://cfdf.tistory.com/30
Android OS 에서도, App 자체에서 사용하는 암호키를 보다 안전하게 보관하게 위한 서비스를 제공하고 있는 데, 이것이 바로 Android KeyStore Service(AndroidKeyStore 라고 부름)이다.KeyStore Service에서 제공하는 keystore(키스토어)에 암호키를 보관한다.
Android OS에서 암호화 기능을 제공하는 목적은 App 에서 다루고 있는 정보 중외부로 유출이 되어서는 안되는 중요한 data를 안전하게 보관하는 방법은 암호화를 시켜 저장하는 방법 밖에 없기 때문. 특정 App에서 다루는 data는 다른 App에서는 access할 수 없으나, "Rooting"을 통하여 권한 상승을 하면, 모든 App에서 만든 data를 access할 수 있기 때문이다.
참고로, 사용 App 내부에 암호키를 hard coding된 상태로 저장하는 경우는 App을 디컴파일하면 암호키가 바로 노출이 된다.
Android Keystore
Android Device에서 암호키를 안전하게 저장하기 위해 사용하는hardware 장치를 Android Keystore 라고 부른다. 즉 Android OS에서 제공하는 "KeyStore Service"를 제공하기 위해 만들어진 hardware가 바로 Android Keystore 이다. Android Device 제조사는 자신들의 Android Keystore를 hardware적으로 디자인하여, hardware를 구동하기 위한 driver software를 함께 제공하기만 하면 된다. 다시 정리하면, Android Keystore는 Android Device 제조사가 제공하는 "hardware 기반 secure key storage" 이다. Hardware란, TEE(Trusted Execution Environment) 또는 SE(Secure Element)를 지원하는 장치다.
GlobalPlatform(Secure chip 기술에 대한 사양을 만들고 발표하는 non-profit organization) 에서는 2010년도에 TEE에 대한 자신들의 표준을 발표했으며, TEE를 구현한 solution으로 ARM TrustZone 기술이 있다. TrustZone 기술을 기반으로 한 TEE 를 "TrustZone-based TEE" 라고 부른다. TEE는 main processor내에 있는 Secure Area 이며, Android OS 와는 독립된 별도의 OS로 동작함. Andorid 8 버전까지는 TEE 방식만 지원했다. 참고) iOS 도 Secure Enclave라 불리는 유사한 기능을 제공하고 있으며, Notebook PC에서도 암호키를 hardware적으로 안전하게 보관하기 위한 장치로 TPM(Trusted Platform Module) 를 장착하기도 한다. FIPS 140-2 인증을 받은 전용 HSM 장비 보다는 못하지만 software적인 방법 보다는 훨씬 안전하기 때문. 서버에서 사용하는 암호키는, "FIPS 140-2 Level 3 또는 Level 4 인증을 받은 전용 HSM 장비"를 사용하여 암호키를 안전하게 보관한다.
Android Keystore는 Android API 18버전(Jelly Bean, OS version 4.3)부터 지원하기 시작한 "hardware security" 기능이다. Android API에서는 Key 저장을 위하여 사용되는 "Key Storage"를 지원하기 위한 Interface로java.security.KeyStore 라 불리는 class를 제공하고 있다.
Android Device는 부팅하면서, Keystore에 대한 driver가 없거나, hardware가 인식이 안되면, software적으로 Keystore기능을 구현한다. 따라서 좀 더 깊게 들어가면, Android Keystore는 "hardware 기반 AndroidKeyStore" 와 "software 기반 AndroidKeyStore" 두 가지 종류가 있는데 "software 기반 AndroidKeyStore" 는 "hardware 기반 AndroidKeyStore" 보다 덜 안전하다. 참고로, Android M(Version 6.0) 이전의 "software 기반 AndroidKeyStore" 는 rooting 된 기기에서 암호키 유출이 가능하다.
add 와 replace 중요성의 차이점은 replace 가 기존의 조각을 제거하고 새로운 조각을 추가하는 것입니다. 즉, 다시 버튼을 누르면 대체 된 프래그먼트가 호출되고 onCreateView가 호출됩니다. add 는 기존의 조각을 유지하고 기존의 조각이 활성화 될 것이라는 의미의 새 조각을 추가하는 반면 '뒤로'단추를 누르면 onCreateView가 기존 조각 (새 조각 전에 있던 단편 조각이 추가됨). 프래그먼트의 라이프 사이클 이벤트 onPause와 관련하여, onResume, onCreateView 및 기타 라이프 사이클 이벤트는 replace 될 경우 호출되지만 add 경우에는 호출되지 않습니다.
add() 와 replace() 기본적인 차이점은 다음과 같이 설명 할 수 있습니다.
add() 는 일부 루트 요소에 단편을 단순히 추가하는 데 사용됩니다.
replace() 비슷하게 동작하지만 이전에는 이전 조각을 제거한 후 다음 조각을 추가합니다.
addToBackStack() 을 add() 또는 replace() 와 함께 사용하면 정확한 차이를 확인할 수 있습니다.
add() ... onCreateView가 호출되지 않았을 때 back button을 누르면, replace() 경우에는 back 버튼을 누르면 ... oncreateView가 매번 호출됩니다.