- Today
- Yesterday
- Total
메이쁘
[Kotlin][Android] Android 내장 KeyStore API 를 사용하여 데이터를 암호화-복호화 하기! 본문
[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
디코딩 웹페이지들을 쉽게 찾아볼 수 있기 때문이죠.
그럼 방법이 없냐..?
바로, 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
'Technology > Android - Android Studio' 카테고리의 다른 글
[Android][Kotlin] Coroutine을 사용한 Room DB(DataBase) 핵심 정리 및 샘플 코드! (0) | 2020.07.01 |
---|---|
[Android] Splash 화면을 위한 가장 효율적이고 쉬운 방법(+ Splash 화면의 존재 이유!) (1) | 2020.06.20 |
[Kotlin][JAVA] BottomSheetDialog 설명 및 사용 방법 (직접 커스텀해서 레이아웃 생성!) (0) | 2020.06.20 |
[Android Studio] xml Resourse string tag 불러와서 사용하는 방법 (0) | 2020.04.22 |
[Android Studio] Fragment Refresh(새로고침) 하는 방법 (0) | 2020.03.05 |