Android/SharedPreferences

[Android] EncryptedSharedPreferences로 암호화 하기

O_Gyong 2022. 11. 24.

SharedPreferences로 기기 내에 간단한 데이터를 저장하곤 하는데, 데이터가 실명이나 핸드폰 번호와 같은 개인 정보라면 암호화하여 저장할 필요가 있다. 처음 기기에 저장을 할 때 value를 암호화하여 저장할 수 있지만, 안드로이드에서는 EncryptedSharedPreferences를 제공한다.

 

EncryptedSharedPreferences는 MasterKey를 이용하여 암호화된 SharedPreferences 객체를 생성한다.

예제로 EditText에 입력한 텍스트를 암호화하여 저장하고 불러오기 버튼을 통해 저장된 value를 TextView로 보여주려고 한다.

참고 자료


EncryptedSharedPreferences 의존성 추가

// EncryptedSharedPreferences
implementation "androidx.security:security-crypto-ktx:1.1.0-alpha03"

MasterkeyAlias 생성

val masterKeyAlias = MasterKey
    .Builder(applicationContext, MasterKey.DEFAULT_MASTER_KEY_ALIAS)
    .setKeyScheme(MasterKey.KeyScheme.AES256_GCM)
    .build()

MasterKey.Builder로 통해 암호화 알고리즘 설정하면서 MasterKey 객체로 빌드한다.

암호화 알고리즘은 커스텀한 다른 것들을 사용해도 되지만 일반적으로 잘 사용되고 있는 AES256을 쓰는 게 낫다고 한다.


암호화된 SharedPreferences 객체 생성

/**
 * 암호화된 SharedPreferences 객체 생성
 */
val pref = EncryptedSharedPreferences.create(
    this, // Context
    "encrypted_pref_file", // 파일 명
    masterKeyAlias,
    EncryptedSharedPreferences.PrefKeyEncryptionScheme.AES256_SIV, // AES256_SIV으로 key를 암호화
    EncryptedSharedPreferences.PrefValueEncryptionScheme.AES256_GCM // AES256_GCM으로 value를 암호화
)

입력 텍스트 암호화 및 데이터 불러오기

/**
 * 암호화 하여 저장
 */
mBinding.etMain.setOnEditorActionListener { textView, actionId, _ ->
    // 키보드에서 완료 버튼이 눌렸을 때 처리
    if (actionId == EditorInfo.IME_ACTION_DONE) {
        pref.edit().putString("myKey", textView.text.toString()).apply()
        mBinding.etMain.clearFocus()
    }
    false
}

/**
 * 암호화 한 데이터 불러오기
 */
mBinding.btnMain.setOnClickListener {
    mBinding.tvMain.text = pref.getString("myKey", "")
}

EditText에 입력한 텍스트를 입력하고 불러오기 버튼을 했을 때 성공적으로 데이터를 불러오는 것을 확인했다.

실제 데이터는 Device File Explorer에서 data> data>'패키지 명'> shared_prefs에 있다.

실제 데이터를 보면 암호화된 값이 3개가 있는데 "keyset" 이라고 명칭이 붙은 것은 마스터 키로 모든 서브 키를 암호화는데 사용되고,

나머지 하나는 서브 키로 실제 데이터에 대한 암호화 작업을 수행하는 데 사용된다고 한다.

추가적인 보안 계층을 위해서 이런 동작을 하도록 했다고 한다.

참고 자료

전체 코드

댓글