기존 응용 프로그램에서 E ncryptedSharedPreferences로 이동하는 방법

10552 단어 Android
이 기사는 Android Advent Calendar 2021 16일째 보도입니다.
우선: EncryptedSharedPreferences란 무엇입니까?
Android Developers 데이터를 보다 안전하게 처리
SharedPreferences 클래스 패키지를 두 가지 방법으로 키와 값을 자동으로 암호화합니다.
- 암호화 상태에서도 키를 검색할 수 있도록 확정적 암호화 알고리즘을 사용하여 키를 암호화합니다.
- 값은 AES-256GCM을 사용하여 암호화됩니다.이것은 비결정적이다.
2021년 4월 Stable 버전 ver1.0.0 Jetpack이 발표된 라이브러리입니다.
이 프로그램 라이브러리를 사용하면 암호화된 Shared Preferences의 데이터를 복잡한 코드 없이 읽고 쓸 수 있습니다.
발표된 프로그램에서 이 프로그램 라이브러리를 사용하려면 암호화되고 저장된 데이터를 복호화하고 다시 암호화하여 저장해야 합니다.
이 글에서 그 구체적인 처리에 대해 설명할 것이다.
1. 도입
Android Developers 페이지 참고로 프로그램 라이브러리의 의존 관계를 추가합니다.
app/build.gradle
dependencies {
    implementation "androidx.security:security-crypto:1.0.0"
}
2. 초기화 처리
SharedPreferences 작업을 하는 클래스에서 암호화된 edit를 가져옵니다.
프로그램이 시작될 때와 같은 경우, encryptedPreferencess Name context.packageName 을 그대로 사용하면 문제가 없지만, 같은 이름의 파일에 데이터를 저장했다면, 적절한 suffix를 추가해야 합니다.
    private val encryptedPreferencesName = context.packageName + "_encrypted_preferences"
    private val prefs: SharedPreferences = EncryptedSharedPreferences.create(
        encryptedPreferencesName,
        MasterKeys.getOrCreate(MasterKeys.AES256_GCM_SPEC),
        context,
        EncryptedSharedPreferences.PrefKeyEncryptionScheme.AES256_SIV,
        EncryptedSharedPreferences.PrefValueEncryptionScheme.AES256_GCM
    )
    private val editor = prefs.edit()
또한 라이브러리 가져오기 전에 Shared Preferences에 접근하는 데 사용된 기존 편집도 가져옵니다.
    private val unEncryptedPrefs: SharedPreferences = PreferenceManager.getDefaultSharedPreferences(context)
    private val unEncryptedEditor = unEncryptedPrefs.edit()
3. 데이터 이관 처리
데이터의 이관 처리는 응용 프로그램이 시작될 때 해야 하기 때문에 Application 클래스의 onCreate () 의 시간에 다음과 같은 처리를 실행합니다.
요점마다 해설을 하다.
    fun initialize(keys: List<Pair<String, Boolean>>) { // ポイント①:移管対象の項目を指定する
        val unEncryptedKeys: List<String> = unEncryptedPrefs.all.keys.map { it.toString() }

        keys.forEach {
            val key = it.first
            val isEncrypted = it.second

            unEncryptedKeys.find { it == key }?.let {
                unEncryptedPrefs.all.entries.find { it.key == key }?.let { entry ->
                    if (isEncrypted) {
                        putString(key, getStringWithDecryption(key))
                    } else {
                        when (val value = entry.value) {
                            is String -> putString(key, value)
                            is Int -> putInt(key, value)
                            is Long -> putLong(key, value)
                            is Boolean -> putBoolean(key, value)
                        }
                    }
                    unEncryptedEditor.remove(key).apply() // ポイント②:移管した項目を削除する
                }
            }
        }
    }
요점 ①: 이관 객체의 항목 지정
※ 이 처리가 꼭 필요한 것은 아니다
자신이 담당하는 프로그램에 사용되는 SDK는 기본 Shared Preferences를 사용하여 데이터를 읽고 씁니다.
따라서 여기에는 이관 대상으로 "(SDK가 아님) 어플리케이션에서 관리하는 프로젝트"를 명시적으로 지정해야 합니다.
SDK가 관리하는 프로젝트까지 E-ncryptedSharedPreferences로 관리하면 SDK 측에서 디코딩할 수 없는 오류가 발생합니다.
이 경우 이관 객체를 목록화하는 것이 좋습니다.
    private val keys = listOf(
        Pair("testKey1", false), // キーと暗号化済みの項目か?をPairでまとめる
        Pair("testKey2", true)
    )
②: 이관 항목 삭제
기존 Shared Preferences에서 E ncrypted Shared Preferences로 이전하는 프로젝트에 대해 기존 Shared Preferences에서 데이터를 삭제합니다.
이렇게 되면 다음 프로그램이 시작될 때 이 이관 처리는 실행되지 않을 것이다.
총결산
EncryptedSharedPreferences를 사용하면 Android KeyStore Manager가 아닌 암호화 키와 값을 응용할 수 있습니다.
지금부터 시작하는 프로그램은 처음부터 이 방식으로 읽기와 쓰기를 하면 되지만 기존 프로그램은 구 버전과 일치성을 유지해야 하기 때문에 본 보도에 기재된 것처럼 이관 처리를 해야 한다.
나는 실제 업무에서 이런 상황이 절반을 차지하고 있다고 생각한다. 누군가를 도울 수 있다면 좋겠다
참고 문장
  • Android Developers
  • How to Migrate to Encrypted Shared Preferences
  • 좋은 웹페이지 즐겨찾기