일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- MotionLayout
- paging
- Kotlin
- junit
- 인앱결제
- list
- php
- 동영상
- 테스트 자동화
- mysql
- Observable
- MediaPlayer
- Android
- SwiftUI Tutorial
- android13
- rx
- Reactive
- databinding
- google play
- mvvm
- Android 13
- GCP
- node
- SWIFTUI
- PagingLib
- Koin
- RxKotlin
- MediaSession
- node.js
- Animation
- Today
- Total
봄날은 갔다. 이제 그 정신으로 공부하자
단말에 저장된 내 메모를 보호하는 앱 만들기 - 1편 본문
서론
저는 핸드폰에 많은 정보를 기록하는 편입니다.
문득 떠오르는 아이디어들과 집에 갈 때 사야 하는 것들 그리고 민감한 개인 정보까지...
이러다보니 핸드폰이 해킹 당하면 내 개인 정보가 그대로 빠져나가는 문제가 생기겠더라구요.
마켓에 암호화를 지원하는 다양한 메모장 앱이 있었지만 왠지 불안하고 마음에 안들더라구요.
그래서 내가 개발자인데 내가 만들자!라는 반쯤 뇌절한 결론을 내리고 앱을 만들기로 했습니다.
내 메모를 보호하는 앱 만들기는 아래 순서로 연재하도록 하겠습니다.
- 1편: 내 메모를 보호하는 기술(암호화, 보안) 소개
- 2편: 내 메모를 보호하는 앱 기획
- 3편: 내 메모를 보호하는 앱 소스 코드 설명
내 메모를 보호하는 앱 만들기에 적용된 기술
가장 중요한 것은 메모를 안전하게 보호하는 것으로 메모는 대칭키 방식(AES-256)을 사용해서 관리하고, 암호화/복호화에 사용하는 대칭키는 비대칭키 방식(BCrypt)을 사용하여 안전하게 관리합니다.
즉, 사용자가 앱을 실행하거나 메모를 보기 위해서는 패스워드를 입력해야 하는데 이 패스워드를 비대칭키 방식(BCrypt)으로 관리해서 허가 받은 사용자가 앱을 실행하거나 메모에 접근하는지 확인하는 것 입니다.
그림으로 설명하면 아래와 같습니다.
AES-256 암호화 (대칭키 방식)
AES-256는 256비트의 Secret key키를 사용하는 대칭키 방식의 암호화로 대칭키 방식의 암호화 방식 중 가장 유명한 방식이며 유명한 만큼 보안 성능 또한 우수합니다.
BCrypt 해시 암호화 (비대칭키 방식)
Bcrypt는 Blowfish 암호에 기반을 둔 해시 함수로 1999년 USENIX에서 발표되었으며 Bcrypt 함수는 OpenBSD 및 수세 리눅스 등의 일부 리눅스 배포판을 포함한 기타 시스템용 기본 암호 해시 함수 입니다.
Bcypt 암호화 해시 알고리즘의 큰 특징은 SHA 계열에서 약점으로 지적된 빠른 연산으로 인한 brute force 공격에 대한 대비책으로 Blowfish의 특징 중 하나인 key setup phase 라는 일종의 막대한 전처리 요구(Salting)로 느리게 만들고 반복횟수(Key Stretching)를 변수로 지정가능하게 하여 작업량 (=해싱시간) 을 조절할 수 있게 하였습니다.
왜 사용자의 패스워드를 저장하나요?
사용자의 패스워드를 저장하지 않는 것이 보안적으로 가장 안전하나 그럴 경우, 앱이 뭐 할 때마다 수시로 패스워드를 요구하게 되어 앱 사용성이 매우 떨어지므로 이를 개선하기 위해 패스워드를 암호화하여 저장합니다.
여기까지하면 내 메모를 안전하게 지킬 수 있습니다.
하지만 가장 좋은 것은 메모 자체가 앱 외의 공간에 노출이 되지 않는 것이고 이것은 즉, 앱이 해커로부터 안전해야 한다는 것이므로 이를 위해 추가로 아래와 같은 기술(디버깅 감지, 루팅 감지, 앱 위변조 감지)이 필요합니다.
디버깅 감지
앱이 디버깅 상태에 노출된 상태에서 실행되는 것은 반드시 막아야 합니다.
이를 위해 앱 실행 시 그리고 수시로 단말이 ADB 디버깅이 켜져 있고 USB가 연결되어 있는지 감지하고 두개 모두 감지될 경우,
디버깅 상태라고 판단하고 앱을 종료시켜야 합니다.
이를 확인하는 코드는 아래와 같습니다.
// ADB 디버깅 ON 감지
private fun isDebugEnable(context: Context): Boolean {
return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
Settings.Global.getInt(context.contentResolver, Settings.Global.ADB_ENABLED, 0) != 0
} else Settings.Secure.getInt(context.contentResolver, Settings.Secure.ADB_ENABLED, 0) != 0
}
// USB 연결 감지
private fun isUsbConnected(context: Context): Boolean {
val intent = context.registerReceiver(null, IntentFilter("android.hardware.usb.action.USB_STATE"))
return intent != null && intent.extras != null && intent.getBooleanExtra(
"connected",
false
) == true
}
루팅 감지
루팅된 OS에서 앱이 실행된다면 앱이 외부에 공유하지 않은 파일이 노출될 수 있으므로 루팅된 OS를 감지하는 기능이 필요합니다.
루팅된 OS는 앱에서 루트 권한 접근이 가능하므로 아래와 같이 루트권한 접근이 가능한지 이를 확인하는 코드를 추가합니다.
아래 함수에서 true가 리턴된다면 앱이 루팅된 OS에서 실행되는 경우이므로 앱을 종료합니다.
코드는 아래와 같습니다.
private fun isRooting(): Boolean {
var flag = false
try {
Runtime.getRuntime().exec("su")
flag = true
} catch (ex: Exception) {
}
return flag
}
앱 위변조 방지
그럴 일은 없겠지만 누군가 "내 메모를 보호하는 앱"을 위변조해서 배포한다면 문제가 될 수 있습니다.
위변조를 막기 위해서는 내 android studio의 릴리즈키를 체크하는 방식인데, 저는 "내 메모를 보호하는 앱"에는 네트워크를 붙힐 생각이 전혀 없다보니 이 릴리즈 키를 체크하는 방식이 문제가 있습니다.
그럼 어쩔 수 없이 위변조 방지를 위해 체크하는 릴리즈키를 앱에 내장해야 하는데 그럴 경우, 릴리즈키가 노출되므로 보안에 취약해지는 상황입니다.
이를 타개하기 위해 릴리즈키를 비대칭키로 암호화(BCrypt)한 후 결과 값이 암호화된 해시값만 저장하기로 하였습니다.
이렇게 릴리즈 키를 해시로 변환해 저장할 경우, 해커가 내 앱을 위변조 한다면 자신의 릴리즈 키로 내 앱의 해시 값을 맞춰야해 매우 곤란하겠지만 위변조 시 앱에 내장된 암호화된 해시값도 같이 변조하면 되므로 보안적으로는 어느정도 취약성이 있습니다.
정리
메모는 AES-256, BCrypt로 암호화
앱은 "디버깅 감지", "루팅 감지", "앱 위변조 방지"로 보호
연관된 게시글은 아래 링크 클릭...
- 개인정보 보호와 암호화: https://als2019.tistory.com/88
- 패스워드 암호화: https://als2019.tistory.com/87
- 패스워드 암호화에 적합한 해시함수들: https://als2019.tistory.com/86
- 시큐어 코딩 & 난독화: https://als2019.tistory.com/83
- 루팅 감지 & 디버깅: https://als2019.tistory.com/84
- 앱 위변조 방지: https://als2019.tistory.com/85
다음 글에서는 "내 메모를 보호하는 앱"의 기획에 대해 설명하도록 하겠습니다.
많은 개발자들이 기획없이 개발하는데 기획없이 개발하는 것은 오히려 더 많은 시행착오를 하게 되고 그 과정에서 생긴 코드들이 전체 프로그램의 안정성에 악영향을 끼치는 문제가 있습니다.
그러므로 가급적이면 간단하게라도 기획 후 진행하는 것을 추천 드립니다.
'앱 만들기' 카테고리의 다른 글
단말에 저장된 내 메모를 보호하는 앱 만들기 - 3편 (0) | 2022.05.13 |
---|---|
단말에 저장된 내 메모를 보호하는 앱 만들기 - 2편 (0) | 2022.05.05 |