![[Flutter][Error] 난독화와 enum.name](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbXmJml%2FbtsMEZ17Qxz%2FfGWaQqPuMn3UACau3w5or0%2Fimg.png)
개요: 난독화
지금까지 진행했던 프로젝트들은 보안이 크게 중요하지 않아서(사용자가 많지도 않고, 악용할만한 요소가 존재하지 않았다.) 난독화에 시간을 투자하지 않았다. 하지만 난독화를 하긴 해야한다. 디컴파일을 하면 .env파일로 키 값들을 보관한다고 해도, manifest까지도 빼 갈 수 있기 때문에 카카오 키 값들이나 구글 키 값들을 탈취할 수 있다.
물론 Proguard나 dexguard로 난독화를 아무리 한다고 해도 디컴파일을 완벽히 방지한다 까진 아니고 어느정도 시간을 벌 수 있다 정도라서 어쨌거나 누군가가 탈취 시도를 하면 탈취가 된다고 한다. 이 이야기는 특정 대형 서비스들(서비스 이름은 이야기할 수 없다.) 이야기이긴 하나, 기술을 어디까지 사용하냐에 따라 보안이 철저하게 지켜지는 곳도 있는거 같다.
"결국 털리니까 난독화에 돈을 쓸 이유가 없는거 같은데?"
그렇다고 난독화를 안 할 수는 없다. 난독화를 안해놓으면 결국 모든 보안, 소스 코드가 거의 1분도 안되어 탈취당한다. 난독화를 해놓으면 어쨌거나 시간을 벌고 공격에 지연시간을 걸기에 꼭 필요하다.
문제점
난독화를 해주는 서비스는 대표적으로 Proguard, Dexguard 등이 있다. 난독화가 정확히 어떻게 되는지는 블랙박스 정도로만 알고 있어도 해당 서비스들이 해주기에 비교적 쉽게 적용을 할 수 있다.
그러나 문제점이 하나 있는데, 바로 enum이다.
난독화와 enum
난독화 과정을 거치면 객체 이름들이 모두 난독화 과정에서 생성된 이름들로 바뀌게 된다. 내가 `Gorani`라고 클래스 이름을 지었다고 해도, 난독화 과정을 거치고 나면 `Gorani`가 아니라 `o`가 되어버릴 수 있다.
아래와 같은 enum이 있다고 해보자.
enum gorani {
HELLO,
GORANI,
BYE
}
위의 enum은 난독화 되면 다음과 같이 바뀔 수 있다. (무조건 아래와 같이 바뀐다는 것은 아니다.)
enum o {
x,
y,
z
}
그런데 우리는 enum에서 `name`으로 해당 enum의 이름 값을 String의 형태로 가져올 수 있다. 하지만 난독화 과정을 거치고 나면 enum의 이름들이 더 이상 `HELLO`, `GORANI`, `BYE`가 아니게 된다. 이름들은 우리가 작성한 값들이 아닌 `x`, `y`, `z`와 같은 난독화된 코드로 바뀌게 된다.
이정도 읽었다면 눈치를 챘을 것이다. 이렇게 난독화 된 enum에 name을 하게 되면 우리가 의도한 것은 `gorani.HELLO.name`이지만 난독화 된 우리의 코드는 `o.x.name`이 되어 실제로는 `HELLO`라는 String이 전달되는게 아니라 `x`라는 String이 전달되게 된다.
해결
해결하는 방법은 조금은 귀찮지만, enum 내부에 별도의 `label` 필드를 하나 두는 것이다.
enum gorani {
GORANI("GORANI"),
HEELO("HELLO");
final label;
const gorani(this.label);
}
Dart의 enum은 클래스와 같이 내부에 필드를 둘 수 있는데, 여기에 label 필드를 만들어 값을 미리 할당해두면 객체의 이름이 변경되어도 내부에 저장하고 있는 값은 리터럴이므로, 그대로이기에 똑같이 난독화 된 코드라고 해도 정확한 값을 전달할 수 있다.
마치며
이런 문제가 발생할 수 있다는 것을 거의 처음 알았다. 생각보다 많은 정보가 들어와서 난감했는데, 곰곰히 생각해보니 굉장히 자연스럽게 일어날 수 있는 문제라서 더 조심해야겠다는 생각이 들었다.
'Develop > Flutter' 카테고리의 다른 글
[Flutter] SizedBox를 Padding 대신 사용하지 말아야 하는 이유 (0) | 2025.02.08 |
---|---|
[Flutter][Issue] Flutter 카카오 로그인 릴리즈 키 (0) | 2024.12.29 |
[Flutter][Widget][Issue] TabBar 왼쪽에 공간이 생기는 현상 (0) | 2024.12.11 |
[Flutter][Error] Lexical or Preprocessor Issue (Xcode): 에러 해결 (0) | 2024.10.16 |
[Flutter] Event Bus 패턴 (0) | 2024.09.28 |