본문 바로가기
Development/Android

Android - EncryptedSharedPreferences 로 데이터 암호화하기

by du.it.ddu 2023. 11. 14.
반응형

Android 앱을 개발하다보면, 로컬에 저장해야 할 데이터가 있습니다.
사용자가 언제 앱에 접속했는지 라던가, 어떤 옵션을 ON/OFF 했는지에 대한 캐시성 정보들이 예가 될 수 있습니다.

이렇게 민감하지 않은 데이터는 평문을 그대로 저장해도 무방합니다.
하지만 만약 사용자의 개인정보와 관련이 있다거나 서버에 접근할 수 있는 토큰같은 종류라면 문제가 될 수 있습니다.

 

SharedPreferences의 문제점

이 문제를 이해하려면 SharedPreferences와 안드로이드 어플리케이션에 대한 이해가 필요합니다.

SharedPreferences는 XML 형태의 파일로 앱의 저장공간에 저장됩니다.
우리는 SharedPreferences를 선언할 때 아래와 같이 선언합니다.

val sharedPref = context.getSharedPreferences("app_pref", Context.MODE_PRIVATE)

우리는 파라미터로 파일이름을 전달합니다.
여기서 우리는 파일로 저장된다는 것을 어느정도 예감할 수 있습니다.

그리고 우리는 이 파일을 Android Studio의 Device File Explorer를 통해 확인도 할 수 있습니다.
아래와 같이 경로에 xml 파일로 저장이 되기 때문입니다.

/data/data/[APP_PACKAGE_NAME]/shared_prefs/app_pref.xml

<?xml version='1.0' encoding='utf-8' standalone='yes' ?>
<map>
    <string name="key">value</string>
    ...
</map>

즉, 앱의 데이터 영역에 저장되기 때문에 충분히 털릴(?) 가능성이 있다는 것입니다.
그리고 털리면 데이터가 그대로 노출되는 것이죠.

안드로이드는 이렇게 보안적인 문제 때문에 난독화도 하고, 로컬 프로퍼티로 빼기도 하고 여러가지 방법을 동원합니다.
그럼 SharedPreferences는 어떻게 문제를 해결할 수 있을까요?

 

EncryptedSharedPreferences

아주 다행히 큰 노력을 들이지 않고 문제를 해결할 수 있습니다.
이미 SharedPreferenecs에 암호화를 적용한 라이브러리가 제공되고 있기 때문이죠.

https://developer.android.com/reference/androidx/security/crypto/EncryptedSharedPreferences

 

EncryptedSharedPreferences  |  Android Developers

androidx.appsearch.builtintypes.properties

developer.android.com

사용법이 약간은 추가됐지만 그렇게 어렵지도 않습니다.

MasterKey masterKey = new MasterKey.Builder(context)
     .setKeyScheme(MasterKey.KeyScheme.AES256_GCM)
     .build();

 SharedPreferences sharedPreferences = EncryptedSharedPreferences.create(
     context,
     "secret_shared_prefs",
     masterKey,
     EncryptedSharedPreferences.PrefKeyEncryptionScheme.AES256_SIV,
     EncryptedSharedPreferences.PrefValueEncryptionScheme.AES256_GCM
 );

 // use the shared preferences and editor as you normally would
 SharedPreferences.Editor editor = sharedPreferences.edit();

위와 같이 암호화를 위한 키 선언, 그리고 EncryptedSharedPreferences를 사용해서 생성하는 것 뿐입니다.
물론 생성시에 몇몇 파라미터가 추가되긴 했습니다만, 그렇게 어렵지는 않습니다.

이것이 가능한 이유는 SharedPreferences는 인터페이스고, EncryptedSharedPreferences는 SharedPreferences를 구현한 구현체이기 때문이죠.
구글의 큰 그림이었을까요?

 

이렇게 아주 간단한 방법으로 SharedPreferences를 암호화해서 보안을 강화하는 방법을 알아보았습니다.
아쉽게도 DataStore에는 아직 제공되고 있지 않은 기능입니다. 어서 DataStore에도 제공되었으면 좋겠네요. :)

 

반응형