Android Studio의 Device File Explorer를 사용하면 지정한 위치에 파일이 생성되어 있는것을 알 수 있고 열어서 내용을 볼 수도 있습니다. 지난 강의에서 만들었던 xml의 내용은 다음과 같이 되어 있네요. 키와 값이 앱에서 지정한대로 기입되어있는 것을 확인할 수 있습니다.
하지만 앱의 데이터를 이렇게 쉽게 열어볼 수 있게 하는건 좋은 생각이 아닌 것 같습니다. 그래서 구글에서는 SharedPreferences를 암호화 하여 사용할 수 있게 하는 Security 라이브러리를 제공하고 있습니다.
Security는 Android 6.0 (API level 23) 이상부터 사용 가능한데, 이 라이브러리를 사용하면 암호화에 사용할 마스터키를 만들고 그 키로 SharedPreferences의 내용을 암호화/복호화 할 수 있습니다.
데이터를 암호화하는데에는 키가 필요한데요, 이 키를 앱 내부에 저장하면 어떤 형태로 숨겨도 결국은 유출이 가능하다고 생각하시면 됩니다. 그래서 Security 라이브러리는 Android keystore system을 사용해 키를 앱 내부가 아닌, 시스템만이 접근 가능한 컨테이너에 저장하도록 하였습니다.
Android keystore system을 이용해 마스터키를 만들었으면 EncryptedSharedPreferences를 써서 SharedPreferences를 암호화/복호화할 수 있습니다.
우선은 MasterKey 클래스로 암호화에 사용할 마스터키를 생성합니다. 키를 작성하는 알고리즘은 커스텀하여 사용할 수도 있게 되어있지만 여기서는 이미 잘 정의되어있는 AES-256 GCM 알고리즘을 사용하도록 하겠습니다.
다음은 EncryptedSharedPreferences를 이용해 읽고쓰기에 사용할 sharedPreferences 인스턴스를 만들어줍니다. 초기화를 할 때에는 위에서 만든 마스터키와 xml 파일에 적용할 파일 이름, 그리고 데이터를 암호화할 방식을 전달해주면 됩니다. 여기서는 Key의 암호화에 AES256_SIV, 그리고 Value의 암호화에는 AES256_GCM을 사용하도록 했습니다.
그리고 나머지는 SharedPreferences와 동일하게 사용하면 됩니다. 설정을 다시 저장한 뒤 encrypted_settings.xml의 내용을 확인해보면 다음과 같이 암호화가 되어 있는 것을 알 수 있습니다.