메이쁘

[Kotlin][Android] Android 내장 KeyStore API 를 사용하여 데이터를 암호화-복호화 하기! 본문

Technology/Android - Android Studio

[Kotlin][Android] Android 내장 KeyStore API 를 사용하여 데이터를 암호화-복호화 하기!

메이쁘 2020. 6. 28. 22:40

안녕하세요.

 

Android KeyStore 시스템을 사용하는 이유 및 방법에 대해 포스팅하려 합니다.

 

 

여기서 말하는 KeyStore 는 APK 추출 시 필요한 jks 키 가 아니라

 

java.security.KeyStore 라는 내장 라이브러리를 뜻합니다.

 

이 자체 KeyStore를 사용하여 데이터를 더욱 견고하게 암호화할 수 있어 

 

보안성이 높아지는데요.

 

 

 

우선, 어디서 사용하는지, 어떻게 사용하는지 부터 알아가보겠습니다.

 

 

 

Android KeyStore를 왜 사용하려 하는가?


서버 DB에 저장하기에는 그렇게 가끔 쓰이는 것도 아닐 뿐더러 규모도 크지 않고,

 

그렇다고 자주 변경되는 건 아닌데 앱 내에서 자주 사용되는 데이터.

 

또한, ROOM DB나 Sqlite 같은 앱 내장 DB는 배보다 배꼽이 큰 느낌이 듭니다.

 

 

종종 개발할 때 이런 데이터를 활용해야하는 경우들이 있습니다.

 

 

이럴 때 사용하는 것 중 하나가 바로 Shared Preferences 입니다.

 *** 다른 포스팅에서 다뤄보겠습니다.

 

 

 

간단히 말씀드리면,

 

Shared Preferences 는 앱 내장 디렉토리에 xml 파일을 생성하고, 여기에 key : value 로 값을 저장하는 방식입니다.

 

그래서 저장해뒀다 필요할 때 해당 파일을 실행해서 value만 가져오면 됩니다.

 

규모도 크지 않고, 앱 삭제 시 함께 삭제되니까 일석이조 입니다.

 

 

 

그럼 과연 보안성은 어떨까요?

 

ADB를 사용하여 루트 권한으로 앱을 실행한다면...

 

앱 내부 파일을 확인 / 수정할 수 있어지고

 

Shared Preferences 또한 안전할 수 없습니다.

 

따라서..!

 

 

"데이터를 암호화하자!"

 

 

하지만, base64 같은 암호화 알고리즘을 사용한다면 쉽게 뚫을 수 있습니다.

https://www.convertstring.com/ko/EncodeDecode/Base64Decode

 

Base64로 디코딩 - 온라인 Base64로 디코더

당신의 Base64로 여기에 텍스트를 디코딩 복사 파일로 디코딩 Base64로 다운로드 :

www.convertstring.com

디코딩 웹페이지들을 쉽게 찾아볼 수 있기 때문이죠.

 

 

그럼 방법이 없냐..?

 

 

바로, Android KeyStore 시스템이 있습니다!

 

 

 

Android KeyStore 는?


  -  안드로이드의 컨테이너 부분에 개인 키를 저장해두고, 암호화 / 복호화 시 해당 키를 가져와 진행합니다.

 

  -  컨테이너에 저장한 순간, 해당 키를 사용자가 직접 추출하거나 열어볼 수는 없습니다. (극한의 굇수라면 가능할수도..?)

  

  -  애플리케이션 단에서 직접 컨테이너에 접근이 어렵고, 시스템 측에서만 접근이 가능하기 때문에 보안성이 매우 높아집니다.

 

  -  또한, 앱 삭제 시 키도 함께 삭제되며, 개개인의 앱 별로 키가 다르기 때문에 고유한 공통키 알고리즘이 따로 없습니다.

 

  -  마지막으로, 패키지를 덮어씌우거나 APK 까서 접근하는 모든 방법 또한 통하지 않습니다.

 

  -  Android M(API 23) 이상 부터 사용 가능합니다. 

 

 

 

정말 대단하죠?!

 

 

이를 사용할 수 있는 코드는 하단에 있습니다.

 

base64 + RSA 알고리즘을 사용한 KeyStore API class 코드 입니다.

 

 

 

 

감사합니다.

 

 

 

 

참고
https://j-a-l.tistory.com/97
https://developer.android.com/training/articles/keystore?hl=ko
https://hyperconnect.github.io/2018/06/03/android-secure-sharedpref-howto.html

Comments