Android 설치된 앱의 서명값 (Signature) 확인 방법

개요

Android 앱 개발에서 서명(Signature)은 앱의 신뢰성과 무결성을 검증하는 중요한 요소입니다. 특히 앱 간의 통신이나 보안 민감 기능을 구현할 때, 다른 앱이 신뢰된 앱인지 확인하기 위해 서명 값을 비교하는 방식이 자주 사용됩니다.


1. Android 11+ (API 30 이상): 패키지 정보 보기 위함

<!-- Android 11 이상에서 모든 앱 정보를 보려면 필요 -->
<uses-permission android:name="android.permission.QUERY_ALL_PACKAGES"
    tools:ignore="QueryAllPackagesPermission" />

2. 설치된 앱 목록 가져오기

private fun getInstalledApps(context: Context): List<AppInfo> {
    val installedApps = context.packageManager.getInstalledApplications(PackageManager.GET_META_DATA)

    return installedApps.mapNotNull { app ->
        val appName = context.packageManager.getApplicationLabel(app).toString()
        val packageName = app.packageName

        // 시스템 앱 제외하고 싶다면 조건 추가
        //if ((app.flags and ApplicationInfo.FLAG_SYSTEM) == 0) {
        AppInfo(appName, packageName)
        //} else null
    }
}

data class AppInfo(
    val name: String,
    val packageName: String
)

3. 서명값 가져오기

private fun getSignatureDigest(context: Context, targetPackage: String): String? {
    return try {
        val packageInfo = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
            val signingInfo = context.packageManager.getPackageInfo(
                targetPackage,
                PackageManager.GET_SIGNING_CERTIFICATES
            ).signingInfo!!

            if (signingInfo.hasMultipleSigners()) {
                signingInfo.apkContentsSigners
            } else {
                signingInfo.signingCertificateHistory
            }
        } else {
            context.packageManager.getPackageInfo(
                targetPackage,
                PackageManager.GET_SIGNATURES
            ).signatures
        }

        val cert = packageInfo?.get(0)?.toByteArray() ?: byteArrayOf()
        val md = MessageDigest.getInstance("SHA-256")
        val digest = md.digest(cert)

        digest.toHex()
    } catch (e: Exception) {
        e.printStackTrace()
        null
    }
}

// 서명값 Sha256 형태로 표시하기 위한 확장함수
fun ByteArray.toHex(): String = joinToString(separator = ":") { "%02X".format(it) }

4. 호출 예시


5. 결론



Related Posts