Попробуйте это из этого источника: https://www.airpair.com/android/posts/adding-tampering-detection-to-your-android-app:
2 Проверка сертификата подписи вашего приложения во время выполнения
Условие: в блоге разработчиков Android есть отличная статья о подписании вашего приложения.Я рекомендую сначала прочитать это, так как этот метод опирается на эти знания.
В двух словах, разработчики должны подписать приложения своим закрытым ключом / сертификатом (содержащимся в файле .keystore), прежде чем приложение можно будет установить на пользовательские устройства.,Сертификат подписи должен оставаться неизменным на протяжении всего жизненного цикла приложения и, как правило, иметь срок действия в будущем 25 лет.
Надежность сертификата подписи разработчика зависит от системы Android при работе с приложениемобновления.Например, хотя я мог создать приложение с тем же идентификатором приложения, что и Facebook, я не смог обманом заставить пользователей перейти на мою версию, поскольку она не подписана сертификатом Facebook.Как разработчики, мы должны держать этот сертификат в секрете, в противном случае мы рискуем, что другие смогут подписывать приложения под нами.
Совет. Держите ваш закрытый ключ (файл .keystore) вне контроля исходного кода и в отдельном защищенном и защищенном хранилище.up system.
Подпись приложения будет нарушена, если файл .apk будет каким-либо образом изменен - неподписанные приложения обычно не могут быть установлены.Например, мы можем представить, как злоумышленник удаляет код проверки лицензии, чтобы включить все функции приложения без оплаты.Более опасный пример - изменение .apk для включения вредоносного ПО в легитимное приложение для сбора конфиденциальных пользовательских данных.Чтобы установить измененный .apk, злоумышленник должен подать его в отставку.
Этот метод подробно описывает, как убедиться, что ваш .apk был подписан вашим сертификатом разработчика, и использует тот факт, что сертификат остается согласованным.и что только у вас есть доступ к нему.
Мы можем разбить эту технику на 3 простых шага:
Найти вашу подпись сертификата разработчика.Вставьте свою подпись в константу String в вашем приложении.Убедитесь, что подпись во время выполнения соответствует нашей встроенной подписи разработчика.
private static final int VALID = 0;
private static final int INVALID = 1;
public static int checkAppSignature(Context context) {
try {
PackageInfo packageInfo = context.getPackageManager()
.getPackageInfo(context.getPackageName(),
PackageManager.GET_SIGNATURES);
for (Signature signature : packageInfo.signatures) {
byte[] signatureBytes = signature.toByteArray();
MessageDigest md = MessageDigest.getInstance("SHA");
md.update(signature.toByteArray());
final String currentSignature = Base64.encodeToString(md.digest(), Base64.DEFAULT);
Log.d("REMOVE_ME", "Include this string as a value for SIGNATURE:" + currentSignature);
//compare signatures
if (SIGNATURE.equals(currentSignature)){
return VALID;
};
}
} catch (Exception e) {
//assumes an issue in checking signature., but we let the caller decide on what to do.
}
return INVALID;
}
Во-первых, нам нужно найти подпись нашего сертификата, чтобы мы могли встроить его в приложение.Я включил строку для вычисления и записи этого в системный журнал - само собой разумеется, что это должно быть удалено, как только у вас будет копия.
Проверьте вывод logcat на наличие сообщения, похожего на это:
10-10 17: 37: 11.483: D / REMOVE_ME: (111): 478yYkKAQF + KST8y4ATKvHkYibo =
Запишите кодированную подпись и замените значение статической константы. ПОДПИСЬ:
private static final String SIGNATURE = "478yYkKAQF + KST8y4ATKvHkYibo =";
Во время выполнения PackageManager позволяет запрашивать сигнатуры нашего приложения.Мы перебираем этот массив подписей и сравниваем его с нашей подписью.
Теперь, когда вы запускаете checkAppSignature в своем приложении - когда оно подписано с помощью вашего сертификата разработчика релиза - вы должны увидеть, что оно возвращает 0, то есть действительное.Эта жестко закодированная подпись является идеальным кандидатом для шифрования строк DexGuard.
В качестве альтернативы вы можете считать подписи.Если их больше 1 -> Прервать:
public final String checkSignature()
{
Log.i(TAG, "executeSignatureCheck()");
Signature[] sigs;
try
{
sigs = context.getPackageManager().getPackageInfo(context.getPackageName(), PackageManager.GET_SIGNATURES).signatures;
}
catch (PackageManager.NameNotFoundException e)
{
throw new RuntimeException("PackageManager name not found.");
}
String signature = null;
int sigCount = 0;
for (Signature sig : sigs)
{
signature = getSHA1(sig.toByteArray());
Log.i(TAG, "Signature: " + signature);
sigCount++;
}
if (sigCount > 1)
{
throw new RuntimeException("Invalid signature.");
}
return signature;
}
Вы также должны проверить, было ли приложение загружено из Google Play.(См. «Проверка установщика» по той ссылке, которую я разместил).Но, к сожалению, вы не можете быть уверены, что это работает на каждом устройстве.Я развернул такую проверку и выпустил ее в Google Play для Alpha, но 2 из 9 устройств не вернули строку.Я не смог выяснить, не работает ли Google Play Store или устройства действительно не возвращают ни одной из этих строк.(см. мою проблему здесь: Возможно ли, что getInstallerPackageName () имеет значение NULL при загрузке приложения из Google Play Store? )