Можно ли получить цифровой отпечаток сертификата в приложение?

Можно ли получить цифровой отпечаток сертификата из play console в своём приложение на java? введите сюда описание изображения

Мне нужно что бы у любого человека который скачает приложение из play market при открытие приложения брался этот цифровой отпечаток и отправлялся ко мне на сервер. Есть ли какие то библиотеки позволяющие получить сам отпечаток сертификата и будет ли безопасно такое действие с моей стороны в случае декомпеляции моего приложения?


Ответы (1 шт):

Автор решения: ЮрийСПб

Можно получить. Например так:

@SuppressLint("PackageManagerGetSignatures")
fun getCertificateFingerprints(packageName: String = context.packageName): List<String?>? {
    try {
        val info = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
            packageManager.getPackageInfo(
                packageName,
                PackageManager.GET_SIGNING_CERTIFICATES
            )
        } else {
            packageManager.getPackageInfo(
                packageName,
                @Suppress("DEPRECATION")
                PackageManager.GET_SIGNATURES
            )
        }

        return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
            info.signingInfo.apkContentsSigners
        } else {
            @Suppress("DEPRECATION")
            info.signatures
        }
            .map {
                MessageDigest.getInstance("SHA")
                    .apply { update(it.toByteArray()) }
                    .digest()
                    .toBase64()
            }
    } catch (e: Exception) {
        Timber.e(e)
        return null
    }
}

private fun ByteArray.toBase64() = String(Base64.encode(this, 0))

Опасности никакой нет - вы получите только отпечаток ключа, не сам ключ. Полученные значения в целом публичные и не страшно их показывать.

→ Ссылка