프로그래밍/android

[kotlin] android EncryptedSharedPreferences example

-샤리- 2020. 8. 10. 15:04

전화번호나 비밀번호 등 민감한 개인정보를 로컬에 저장하기 위해서는 상용화 되어 있는 AES256이나 MD5같은 암호화 알고리즘 함수를 사용하여 SharedPreferences로 저장하거나 sqlite 또는 realm 등 로컬 db에 저장하고 꺼내오면서 사용을 했었다. 하지만 이제 그럴 필요없이 "암호화 + SharedPreferences 저장"을 한방에 해결할 수 있는 방법이 제공되었다.(제공된지 좀 되긴 했지만 ...)

 

developer android의 내용을 먼저 읽어보길 바란다.

 

EncryptedSharedPreferences  |  Android 개발자  |  Android Developers

EncryptedSharedPreferences public final class EncryptedSharedPreferences extends Object implements SharedPreferences java.lang.Object    ↳ androidx.security.crypto.EncryptedSharedPreferences An implementation of SharedPreferences that encrypts keys an

developer.android.com

 

[app/build.gradle]

implementation "androidx.security:security-crypto:1.0.0-alpha02"

 

[변수 선언]

lateinit var masterKeyAlias: String
lateinit var sharedPreferences: SharedPreferences

 

[initialize]

masterKeyAlias = MasterKeys.getOrCreate(MasterKeys.AES256_GCM_SPEC)
sharedPreferences = EncryptedSharedPreferences.create(
		"your_encrypted_shared_prefs_file_name",
		masterKeyAlias,
		context,
		EncryptedSharedPreferences.PrefKeyEncryptionScheme.AES256_SIV,
		EncryptedSharedPreferences.PrefValueEncryptionScheme.AES256_GCM
)

 

[example]

/**
  * 비밀번호 저장
  * */
fun savePassword(value: String) {
	var editor = sharedPreferences.edit()
	editor.putString("encryptedPassword", value)
	editor.apply()
}
/**
  * 비밀번호 가져오기
  * */
fun password(): String {
	var password = sharedPreferences.getString("encryptedPassword", "")
	return password
}

 

[주의사항]

안드로이드 6.0 마시멜로부터 가능하기 때문에 minSdkVersion 23 부터 적용할 수 있다. 관리하고 있는 앱이 minSdkVersion 23 미만이라면 EncryptedSharedPreferences를 사용하기 위해서는 minSdkVersion 업데이트를 고려 해야한다.

Manifest merger failed : uses-sdk:minSdkVersion 21 cannot be smaller than version 23 declared in library [androidx.security:security-crypto:1.0.0-alpha02] .... as the library might be using APIs not available in 21
Suggestion: use a compatible library with a minSdk of at most 21,
		or increase this project's minSdk version to at least 23,
		or use tools:overrideLibrary="androidx.security" to force usage (may lead to runtime failures)