[kotlin] 안드로이드 아키텍처 컴포넌트의 데이터 암호화

이번 포스트에서는 안드로이드 앱에서 데이터를 안전하게 저장하기 위해 안드로이드 아키텍처 컴포넌트를 사용하여 데이터를 암호화하는 방법에 대해 알아보겠습니다.

Table of Contents

Room 데이터베이스에서 데이터 암호화

Room은 안드로이드 아키텍처 컴포넌트 중 하나로, 데이터베이스를 쉽게 구축 및 접근할 수 있도록 도와줍니다. Room 데이터베이스에서 데이터를 암호화하려면 RoomDatabase 클래스에서 SqlCipher 라이브러리를 사용할 수 있습니다. 이 라이브러리는 SQLite 데이터베이스의 데이터를 안전하게 암호화해줍니다.

@Database(entities = [User::class], version = 1, exportSchema = false)
@TypeConverters(DateConverter::class)
abstract class AppDatabase : RoomDatabase() {

    companion object {
        private var INSTANCE: AppDatabase? = null

        fun getInstance(context: Context): AppDatabase {
            if (INSTANCE == null) {
                synchronized(AppDatabase::class) {
                    INSTANCE = Room.databaseBuilder(
                        context.applicationContext,
                        AppDatabase::class.java,
                        "app_database"
                    )
                        .openHelperFactory(SupportFactory(BuildConfig.SQL_CIPHER_SECRET.toCharArray()))
                        .build()
                }
            }
            return INSTANCE!!
        }
    }

    abstract fun userDao(): UserDao
}

위 코드에서 BuildConfig.SQL_CIPHER_SECRET에는 데이터를 암호화 및 복호화하는 데 사용할 키가 포함됩니다.

SharedPreferences에서 데이터 암호화

SharedPreferences는 애플리케이션의 설정 정보를 저장하는 데 사용됩니다. 데이터를 SharedPreferences에 저장할 때 암호화하려면 EncryptedSharedPreferences 클래스를 사용할 수 있습니다. 이 클래스는 데이터를 내부적으로 AES 알고리즘을 사용하여 암호화하여 저장합니다.

val masterKeyAlias = MasterKeys.getOrCreate(MasterKeys.AES256_GCM_SPEC)

val sharedPreferences = EncryptedSharedPreferences.create(
    "secret_shared_prefs",
    masterKeyAlias,
    context,
    EncryptedSharedPreferences.PrefKeyEncryptionScheme.AES256_SIV,
    EncryptedSharedPreferences.PrefValueEncryptionScheme.AES256_GCM
)

위 코드에서 MasterKeys를 사용하여 마스터 키를 만들고, 이 마스터 키를 사용하여 EncryptedSharedPreferences를 생성합니다.

결론

안드로이드 아키텍처 컴포넌트를 사용하면 데이터를 안전하게 저장할 수 있습니다. Room 데이터베이스의 경우 SqlCipher 라이브러리를 사용하여 데이터를 암호화하고, SharedPreferences의 경우 EncryptedSharedPreferences 클래스를 사용하여 데이터를 안전하게 저장할 수 있습니다.

이와 같은 방법을 통해 사용자의 개인정보나 민감한 데이터를 보다 안전하게 보호할 수 있습니다.

참고 자료