반응형

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를 알아내면 암호키를 사용할 수 있는 상태가 된다.

WBC의 개선점

- Size를 줄이고, 속도를 높이는 것.

반응형
,
반응형

Android KeyStore 와 Keystore 의 차이?

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 된 기기에서 암호키 유출이 가능하다.

 

반응형

'Tech develop > 인증' 카테고리의 다른 글

HMAC(Hash-based Message Authentication Code)  (1) 2021.07.29
RSA 암호 알고리즘이란?  (0) 2021.07.29
블록 암호화에서의 운영 모드 및 패딩  (0) 2021.07.29
[Android] WhiteBox  (0) 2021.07.29
,
반응형

// // 기본적으로 현재날짜와 시간으로 설정된다.

//    Calendar today = Calendar.getInstance();    

//    System.out.println("이 해의 년도 : " + today.get(Calendar.YEAR));

//    System.out.println("월(0~11, 0:1월): " + today.get(Calendar.MONTH));

//    // (today.get(Calendar.MONTH) + 1)) 이런 형식으로 하면 다음월을 받아 올 수 

//    // 있다. today.get(Calendar.MONTH) + 1로 하면 이상한 값이 나온다. (괄호유무)

//    System.out.println("월(0~11, 0:1월): " + (today.get(Calendar.MONTH) + 1));

//    System.out.println("이 해의 몇 째 주: " + today.get(Calendar.WEEK_OF_YEAR));

//    System.out.println("이 달의 몇 째 주: " + today.get(Calendar.WEEK_OF_MONTH));

//    // DATE와 DAY_OF_MONTH는 같다.

//    System.out.println("이 달의 몇 일: " + today.get(Calendar.DATE));

//    System.out.println("이 달의 몇 일: " + today.get(Calendar.DAY_OF_MONTH));

//    System.out.println("이 해의 몇 일: " + today.get(Calendar.DAY_OF_YEAR));

//    // 1:일요일, 2:월요일, ... 7:토요일

//    System.out.println("요일(1~7, 1:일요일): " + today.get(Calendar.DAY_OF_WEEK)); 

//    System.out.println("이 달의 몇 째 요일: " + today.get(Calendar.DAY_OF_WEEK_IN_MONTH));

//    System.out.println("오전_오후(0:오전, 1:오후): " + today.get(Calendar.AM_PM));

//    System.out.println("시간(0~11): " + today.get(Calendar.HOUR));

//    System.out.println("시간(0~23): " + today.get(Calendar.HOUR_OF_DAY));

//    System.out.println("분(0~59): " + today.get(Calendar.MINUTE));

//    System.out.println("초(0~59): " + today.get(Calendar.SECOND));

//    System.out.println("1000분의 1초(0~999): " + today.get(Calendar.MILLISECOND));

//    // 천분의 1초를 시간으로 표시하기 위해 3600000으로 나누었다.(1시간 = 60 * 60초)

//    System.out.println("TimeZone(-12~+12): " + 

//    (today.get(Calendar.ZONE_OFFSET)/(60*60*1000))); 

//    // 이 달의 마지막 일을 찾는다.

//    System.out.println("이 달의 마지막 날: " + today.getActualMaximum(Calendar.DATE) );





(1) YYYYMMDD 문자 Calendar 로 넘겨주기


String select_Date = "20150101";

Calendar month = Calendar.getInstance();

SimpleDateFormat formatter = new SimpleDateFormat("yyyyMMdd");

month.setTime(formatter.parse( select_Date ));





(2) Calendar 날짜 String 으로 뽑아주기


String date = ""+new SimpleDateFormat("yyyyMMdd").format(calendarData.getTime());


or


String selectDate = "" + android.text.format.DateFormat.format("yyyyMMdd", calendarData);


출처 : https://m.blog.naver.com/PostView.nhn?blogId=komgurrbs&logNo=220262403979&proxyReferer=https:%2F%2Fwww.google.com%2F

반응형
,