시큐어 코딩

내부저장소를 활용한 민감정보 저장

Security_Info 2020. 3. 13. 00:20

서비스의 운용을 위해 필요한 정보를 받는 것은 자연스러운 일입니다.

 

그중 대표적으로 비밀번호를 말할 수 있으며 그외 주체를 식별할 수 있는 정보들에 대해서

우리는 안전하게 처리해줘야할 필요가 있습니다.

민감정보들은 서버로 전송하여 데이터베이스에 암호화한 뒤 저장하는 것이 자연스럽다고 생각할 수 있습니다.

 

 

그러나 편의를 위해 혹은 다른 이유들로 인해 내부 저장소를 사용할 일이 있습니다.

이에 따라 Android에서는 정보의 간단한 저장 및 읽기를 SharedPreferences를 통해 제공합니다.

 

SharedPreferences?

Android에서 제공하는 XML방식의 기술방법입니다.

XML 파일에 Write/Read를 통해 저장된 정보를 빠르게 읽고 쓸 수 있습니다.

 

스마트폰은 사용자가 접근할 수 있는 경로가 매우 한정되어 있습니다.

그중 하나의 경로가 SharedPreferences의 저장 경로입니다.

SharedPreferences 은 주로 /data/data/패키지명/shared_prefs/SharedPreferencs에 저장됩니다.

위의 경로는 관리자 권한이 아니면 들어갈 수 없는 경로입니다.

 

그러나 해당 단말기가 루팅을 하는 순간 저장된 SharedPreferences 경로로 접근이 가능해집니다.

 

예를들어 A사용자의 스마트폰이 악성코드에 감염돼서 루트권한을 탈취 당한다면, SharedPreferences에 저장된 중요정보가 유출될 수 있습니다.

 

이러한 일들을 사전에 방지할 필요가 있습니다.

 

바로 Android Keystore를 이용하여 데이터를 암호화하여 내부 저장소에 저장한다면 비교적 안전할 수 있을것입니다.

다음의 링크를 통해 대응을 해볼 필요도 있습니다.

https://secu-lee-ty.tistory.com/entry/Android-%EA%B0%9C%EB%B0%9C-%EC%8B%9C-%EB%B3%B4%EC%95%88%EC%9D%84-%EC%9C%84%ED%95%9C-KeyStore?category=785056

 

Android 개발 시 보안을 위한 KeyStore

안드로이드 개발 시, 보안의 이슈중 하나가 바로 '시크릿 키'에 대한 보관 방법일 것이다. 현재 문제점 1. '시크릿 키'를 하드코딩 형태로 안드로이드의 어떠한 파일에 숨겨놓은다. - 디컴파일을 통해 '하드코딩'..

secu-lee-ty.tistory.com

 

 

Android Keystore 를 간략히 설명하자면 암호키는 컨테이너라는 안전한 공간에 보관하고 있으며 암호키를 추출하려고 해도 Text, String 등 어떠한 형태로든 추출이 어렵습니다.

 

제가 이미 해봤습니다.. 결국엔 컨테이너에 있는 키 값은 추출이 안되더라구요..

 

다음의 그림은 제가 속해있는 팀의 모든 개발자들에게 가이드했던 내부 저장 로직입니다.

1. 컨테이너에서 암호키를 로드합니다.

2. 민감정보와 컨테이너안에 존재하는 암호키를 통해 민감정보를 암호화하여 암호문을 만든다.

3. 만든 암호문은 SharedPreferencs에 안전하게 저장해줍니다.

 

 

 

복호화는 당연히 반대로 하시면됩니다.

1. 컨테이너에서 암호키를 로드합니다.

2. SharedPreferencs 에 저장된 암호문을 로드합니다.

3. 암호문과 암호키를 통해 복호화하여 원래의 평문 정보를 획득합니다.

 

* 암/복호화 로직에서 Android Keystore의 키를 로드해서 암/복호화를 진행 해야합니다.

 

 

마치며

위의 방식으로 Android Keystore의 방법으로 저장한다면, 유출이 되어도 공격자는 알아볼 수 없는 데이터를 가지게됩니다.