APK 서명 확인: 앱이 안전한지 확인하는 방법
Android에서 앱을 사이드로딩하면 자유와 유연성이 제공되지만 변조된 애플리케이션라는 큰 위험이 따릅니다. 악의적인 행위자는 인기 있는 앱을 비공식 사이트에 재배포하기 전에 스파이웨어나 애드웨어를 포함하도록 수정하는 경우가 많습니다. 방금 다운로드한 APK가 개발자가 Google Play에 업로드한 것과 정확히 동일한지 어떻게 확신할 수 있나요?
대답은 APK 디지털 서명로 귀결됩니다. 아래에서는 앱 서명이 실제로 어떻게 작동하는지 알아보고, 신뢰하기로 결정하기 전에 온라인 APK 검증기를 사용하여 APK의 해시와 인증서를 확인하는 방법을 살펴보겠습니다.
60초 버전:
Android는 게시자 키를 사용하여 모든 APK에 서명합니다. 전화기는 서명이 기존 설치와 일치하지 않는 "업데이트"를 거부합니다. 이것이 OS의 주요 가장 방지 방어 수단입니다. 사이드로드된 APK를 확인하려면 SHA-256 해시와 서명 인증서 지문을 계산한 다음 두 값을 신뢰하는 값(기존 Play 스토어 설치, 개발자가 게시한 지문 또는 알려진 양호한 이전 사본)과 비교합니다. 일치는 파일이 바이트와 동일하고 동일한 게시자가 서명했음을 의미합니다. 불일치는 설치하지 마세요를 의미합니다.
APK 서명이란 무엇입니까?
디지털 서명은 암호화된 신원 증명입니다. 개발자가 앱을 완성하면 개인 키(키 저장소)를 사용하여 앱에 "서명"합니다. 그런 다음 Android는 APK에 포함된 해당 공개 키를 사용하여 다음을 보장합니다.
- 무결성: 파일이 서명된 이후 변경되지 않았습니다.
- 진위성: 개발자는 그들이 말하는 사람입니다.
- 업데이트: 동일한 키로 서명된 APK만 휴대폰의 기존 앱을 업데이트할 수 있습니다.
서명의 발전: V1, V2, V3 및 V4
Google은 수년에 걸쳐 APK 보안을 지속적으로 개선해 왔습니다.
- V1(Jar 서명): ZIP의 개별 항목에 서명합니다. 느리고 특정 공격에 취약합니다.
- V2(APK 서명 체계): 전체 파일 블록에 서명합니다. 훨씬 더 빠르고 안전하게 인증할 수 있습니다. (Android 7.0 이상)
- V3(키 순환): 개발자가 앱 업데이트를 유지하면서 서명 키를 변경할 수 있습니다. (Android 9.0 이상)
- V4(스트리밍): ADB를 통한 증분 설치에 최적화되었습니다. (Android 11 이상)
APK 서명을 온라인으로 확인하는 방법
APK 검증 도구는 해시만 계산하는 것이 아닙니다. 인증서 체인에 대한 전체 암호화 감사를 수행합니다. 사용 방법은 다음과 같습니다.
확인 단계:
- APK 검증자 페이지로 이동합니다.
- APK 또는 XAPK 파일을 선택하세요.
- 우리 도구는 META-INF/ 디렉터리를 구문 분석하고 인증서 데이터(.RSA, .DSA 또는 .EC를 추출합니다).
- 분석이 완료될 때까지 기다립니다(몇 초 밖에 걸리지 않습니다).
- 인증서 정보: 개발자 이름, 조직, 출신 국가를 검토하세요.
- 해시 확인: 당사 사이트에 표시된 SHA-256을 게시자가 자체 공식 사이트, 프로젝트 릴리스 페이지 또는 서명 매니페스트에 게시한 값과 비교하세요.
보안 경고
검증자가 Facebook이나 WhatsApp과 같은 주요 앱에 대해 "디버그 인증서" 또는 알 수 없는 "자체 서명" 엔터티를 표시하는 경우 설치하지 마세요입니다. 거의 확실히 손상되었습니다.
체크섬 이해(MD5, SHA-1, SHA-256)
체크섬은 전체 파일을 나타내는 고정 길이 문자열입니다. 앱 아이콘에서 단일 픽셀을 변경하면 SHA-256 해시가 완전히 변경됩니다.
| 해시 유형 | 보안 수준 | 메모 |
|---|---|---|
| MD5 | 레거시 | 충돌에 취약합니다. 보안을 위한 것이 아닙니다. |
| SHA-1 | 보통 | 여전히 빠른 조회에 널리 사용됩니다. |
| SHA-256 | 우수 | 앱 검증을 위한 최신 표준입니다. |
서명 인증서가 실제로 알려주는 것
검증자가 인증서를 반환할 때 사이드로딩 안전에 중요한 부분은 X.509 메타데이터의 다채로운 비트가 아니라 소수의 필드입니다. 실제적인 측면에서:
- 인증서의 SHA-256 지문입니다. 이는 가장 중요한 단일 값으로, 서명 키를 고유하게 식별하는 64자리 16진수 해시입니다. 동일한 SHA-256 지문을 가진 두 개의 APK가 동일한 개인 키로 서명되었습니다. 이것이 바로 OS 업데이트 논리에서 "서명 연속성"이 의미하는 것입니다.
- 주체 고유 이름. 종종 CN=Some App, O=Example Inc., C=US와 같은 것입니다. 공격자가 자체 서명된 인증서의 DN에 원하는 문자열을 넣을 수 있으므로 신원 증명이 아닌 힌트로 유용합니다. 항상 이름이 아닌 지문을 대조 확인하십시오.
- 유효기간. 대부분의 합법적인 게시 키는 최대 25년의 유효 기간으로 생성됩니다(기록 권장 사항은 10000일). 다음 달에 만료되는 인증서 또는 이미 유효 기간이 과거와 겹치는 인증서는 위험 신호입니다.
- 서명 알고리즘. 최신 앱은 SHA256withRSA 또는 SHA256withECDSA를 사용합니다. MD5가 깨졌습니다. SHA1withRSA는 더 이상 사용되지 않습니다. 2026년에는 v1/SHA-1로만 서명된 APK가 의심됩니다.
해시와 서명: 대부분의 튜토리얼에서 건너뛰는 차이점
사람들은 종종 "해시"와 "서명"을 혼동합니다. 그것들은 매우 다른 목적으로 사용되며 안전한 검증을 위해서는 다음 두 가지가 모두 필요합니다.
- 전체 APK의 SHA-256는 파일의 바이트가 참조 사본과 동일한지 여부를 알려줍니다. 귀하의 해시가 게시자가 게시한 해시와 일치하면 해당 해시를 계산한 이후 파일이 변경되지 않은 것입니다. 해시 확인만으로는 누가 바이트를 생성했는지 알 수 없습니다. 해시시
- 서명는 누가 바이트를 생성했는지, 특히 서명 인증서와 쌍을 이루는 개인 키 소유자가 이 파일을 생성했음을 증명합니다. 서명 확인만으로는 서명 후 파일이 변조되었는지 여부에 대해 아무 것도 알 수 없습니다(OS는 이를 감지하고 거부하지만 인증서 자체는 파일 내용에 대해 "알지" 못합니다).
사이드로드된 APK의 경우 가장 강력한 보증은 두 가지를 결합합니다. 인증서 지문은 게시자의 알려진 지문 그리고와 일치하고 파일의 SHA-256은 게시자가 해당 빌드에 대해 게시한 값과 일치합니다.
신뢰할 수 있는 참조 지문을 얻을 수 있는 곳
검증에서 가장 어려운 부분은 비교할 올바른 값을 아는 것입니다. 대략적인 신뢰도 순서에 따른 몇 가지 신뢰할 수 있는 접근 방식은 다음과 같습니다.
- 게시자의 자체 웹사이트 또는 릴리스 페이지입니다. 많은 오픈 소스 프로젝트와 보안에 민감한 공급업체는 다운로드와 함께 서명 인증서의 SHA-256 지문을 게시합니다. 이것이 바로 표준입니다.
- 기존 Play 스토어 설치. 앱이 Play 관리 기기에 이미 설치된 경우 해당 인증서 지문은 정의에 따라 게시자의 지문입니다. 사이드로드된 APK의 지문을 그것과 비교하세요. Apk 분석기(Android Studio) 또는 apksigner verify --print-certs와 같은 도구는 설치된 APK에서 직접 읽습니다.
- 이 앱을 설치한 첫 번째 APK입니다. 한동안 앱을 사용했는데 "서명 불일치" 메시지가 표시되지 않은 경우 이전 사본을 참조로 사용할 수 있습니다. 동일한 게시자의 후속 업데이트는 동일한 키를 사용해야 합니다(또는 v3를 통해 순환하며 이 경우 체인은 계속 확인합니다).
- 보관처리된 공개 스냅샷입니다. Internet Archive 및 유사한 서비스는 때때로 선언된 해시와 함께 이전 APK 릴리스 페이지를 보존합니다. 원래 게시자 페이지가 사라진 아주 오래된 빌드에 유용합니다.
일반적인 확인 실수
- 잘못된 필드를 비교합니다. "APK 파일의 MD5"는 "인증서의 MD5"와 동일하지 않습니다. 후보 파일과 참조에 동일한 필드를 사용하십시오.
- 파일 자체의 메타데이터를 신뢰합니다. APK는 매니페스트에 모든 버전 문자열, 패키지 라벨, 작성자 태그를 포함할 수 있습니다. 그 중 어느 것도 암호화되지 않습니다. 서명 블록은 OS가 실제로 확인하는 유일한 것입니다.
- 친구가 파일을 보냈기 때문에 확인을 건너뛰는 중입니다. "이것은 공식 APK입니다"라고 말하는 친구는 당신보다 더 이상 인증하지 않았습니다. 확인할 수 있는 지문을 공개하는 출처를 고집하세요.
- 하나의 일치하는 필드를 충분하게 처리합니다. 파일의 SHA-256과 인증서의 SHA-256 지문을 모두 일치시킵니다. 하나는 일치하지만 다른 하나는 일치하지 않는 것은 바이트가 변경되었거나 소스가 게시자를 가장하고 있다는 신호입니다.
- "편의"를 위해 Play Protect를 비활성화합니다. Play Protect는 서명 확인을 대체하지 않는 2차 의견 스캐너이지만 Protect는 서명 키가 아닌 콘텐츠를 통해 알려진 불량 패키지에 대해 알고 있기 때문에 서명 확인이 할 수 없는 실제 악성 코드를 포착합니다. 그대로 두십시오.
자주 묻는 질문(FAQ)
Android에서 수정된 APK 설치를 차단하는 이유는 무엇인가요?
새 APK의 서명이 이미 설치된 것과 일치하지 않기 때문입니다. 이를 통해 해커가 실제 뱅킹 앱을 가짜 앱으로 "덮어쓰는" 것을 방지할 수 있습니다.
APK를 수정한 후 다시 서명할 수 있나요?
예, 하지만 다른 키를 사용하게 됩니다. 앱은 "깨끗한" 휴대폰에 계속 설치되지만 더 이상 원래 개발자로부터 업데이트를 받을 수 없습니다.
인증서 고정이란 무엇입니까?
앱이 서버와 통신하기 전에 특정 인증서를 명시적으로 확인하여 올바르게 설치되더라도 변조된 앱을 쓸모 없게 만드는 고급 보안 기능입니다.
모든 사이드로드의 서명 확인 부분 만들기
서명은 최신 Android 보안에서 많은 무거운 작업을 수행하고 있습니다. APK 검증자를 통해 파일을 실행하는 데 몇 초를 더 투자하는 것은 변조된 앱이 설치되기 전에 기기에서 차단하는 저렴한 방법입니다.