마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

apk파일 위변조를 막기위해서.. 선택한 방법인데.. 문제없을지 판단해주세요ㅜㅜ

0 추천
기업내에서 사용하는 안드로이드 프로그램이 있습니다.

운영된지 2년이 넘어 3년이 되어가는데요..

얼마전 변조된 프로그램으로 추정되는 사용자가 발견되어.. 관리자로써 엄청난 충격에 휩싸여 있습니다ㅠㅠ

(기업내에서 직원들만 사용하는 앱이기 때문에, 위변조 할거라고는 생각도 못했거든요...)

이상 사설은 생략하고, 제가 위변조를 막기위해 새운 방법을 말씀드리자면 아래와 같습니다..

아래 내용을 보시고, 이방법에 문제가 있는지, 혹은 향후 문제가 될거래 예상되는 부분이 있는지 판단 부탁 드립니다.

=====================▽아래▽=====================

1. 어플리케이션 실행시 최초 getPackageManager().getPackageInfo() 함수를 이용해서 패키지 정보를 얻음.

2. 얻어낸 패키지정보에서 applicationInfo를 추출

3. applicationInfo에서 sourceDir를 추출(패키지가 설치된 Full경로 인듯..)

4. 해당경로에 위치한 xxxx.apk 파일을 MessageDigest.getInstance("SHA1")를 통해 해쉬값 획득

5. 16진수값으로 포메팅

6. 위 결과값을 서버에서 체킹 / true or false 반환

====================================================

제가 걱정하고 있는 부분은, 위 방법에서 apk파일을 신뢰할수 없다는 겁니다.

설치된 패키지 경로에 있는 .apk 파일이 어떤용도에서 생겨난 건지 알수 없기때문에, 런닝중이거나 혹은 실행 이후에 어떤 이유에서 apk파일이 재작성 되거나 수정되면 혹은 삭제되면 해쉬값까지 변경되기 때문에.. 서버에선 거부될수 밖에 없거든요..

고수님들 조언 부탁드립니다.
kimclber (150 포인트) 님이 2014년 2월 3일 질문

2개의 답변

0 추천
 
채택된 답변

어플의 SHA-1 해쉬값을  사전에 구해 둔후 그 값을 올리게 수정만 하면 뚫릴듯 하네요. 

기업내에서만 사용한다니. 기업내 사원 번호 +  시간 에 대한 값을 문자열로 만든 후 문자열 뒤에 어플 서명시 사용한 publickey로 RSA 돌려 나온 값을 base64하여 붙여 서버로 보내고,

서버에서, 어플 서명시 사용한 privateKey로 뒤에 붙은 값이 제대로 복호화 되는지 검사하시는게 좋으실 듯 합니다.

이 경우에는 시간 정보가 매번 바뀌니 같은 값을 못 만들고, 서버 시간과 하루 이상 차이가 날때도 인증실패를 하도록 하면,  인증 성공시 사용하는 키를 하루 이상 재사용하는 것도 불가능합니다. 

이 경우에도 단말에서 동작되게 하는것은 막을 수 없지만  사원번호가 복호화 안되면, 위조어플 사용자라는 것을 바로 알 수 있으니. 경고 같은 것을 통해 사용 못하게 막으실 수 있을 듯 하네요.

사악미소 (65,330 포인트) 님이 2014년 2월 3일 답변
kimclber님이 2014년 2월 4일 채택됨
0 추천
새버전을 설치하는 경우가 아니면 apk 파일은 바뀌지 않습니다.

방법자체는 괜찮아보이는데, java에서 하면 아무소용이 없구요, jni를 이용해 c++ 로 하셔야 그나마 안전합니다.

 

그런데 기업 내부에서 특정한 사람들만 쓰는 거면 그냥 그 사람 시말서 쓰게 하면 안되나요?
익명사용자 님이 2014년 2월 3일 답변
답변 감사합니다!!
시말서를 쓰거나 하는 정책적인 부분은 제가 취할수 있는 절차도 아니거니와, 이미 위변조된 프로그램을 사용한 사용자에 대한 처리이기 때문에 이전에 방지할수 있는 방법이 필요하거든요..

새로운 버전으로 업데이트 될경우 그때마다 새로운 해쉬값을 서버에 등록할것이기 때문에 문제가 해결됩니다.
(참고로 하위버전의 앱은 최신버전으로 업데이트 하지않고 절대로 서비스를 이용할수 없게 되어있습니다.)

말씀대로라면, 위의 경로에 존재하는 apk파일은 설치할때 한번 생성되서 이후로는 변경되지 않는 다는 말씀이시군요.
저 파일이 어플리케이션 배포시 사용되는 apk과 동일하다고 생각해도 되는건가요? 그렇다면 더 신뢰할수 있을거 같은데..
(패키지 설치경로에 apk파일과 유저에게 배포되는 apk파일이 동일한건지 궁금한겁니다.)

jni를 이용하는것은 2차적으로 추질할 계획입니다.

답변 정말 감사드립니다!!
...