Простейшая проверка подписи на Java
Мой канал: @VolfsChannel
Данная проверка является т.н. "классикой жанра" и первым (иногда и последним) рубежом защиты. Данный пример до безобразия прост, но тем и привлекателен. Никаких заумных и запутанных действий, только рабочий код.
Весь код проверки умещается в одном методе. Имена переменных изменены специально.
Реализация
Объявляем поля:
private static PackageManager pm; private static String name; private static String s; private static byte[] bs; private static Signature[] sa;
Проверяем подпись:
@SuppressLint("PackageManagerGetSignatures")
public boolean b(String st) {
try {
pm = getApplicationContext().getPackageManager();
name = getApplicationContext().getPackageName();
sa = pm.getPackageInfo(name, PackageManager.GET_SIGNATURES).signatures;
//Log.w(Constants.TAG, "Signature[] :: " + Arrays.toString(sa));
for (Signature a$a : sa) {
//Log.w(Constants.TAG, "byte[] :: " + Arrays.toString(bs));
bs = a$a.toByteArray();
//Log.w(Constants.TAG, "new byte[] :: " + Arrays.toString(bs));
bs = CertificateFactory.getInstance("X509").generateCertificate(
new ByteArrayInputStream(bs)).getEncoded();
//Log.w(Constants.TAG, "new byte[] encoded :: " + Arrays.toString(bs));
s = new String(Base64.encode(MessageDigest.getInstance("MD5").digest(bs), 19));
//Log.w(Constants.TAG, "result string :: " + s);
return Objects.equals(s, st);
}
} catch (Exception e) {
return false;
}
return false;
}
Теперь пройдемся по коду, хотя, те кому надо и так уже поняли...
На вход поступает String st.
Следующие 3 строчки - инициализация объектa PackageManager, у которого мы узнаем наше имя пакета. С помощью этого имени мы получаем массив сигнатур - ту самую подпись.
Преобразуем нашу подпись в массив байт. Из полученного массива мы создаём сертификат X509. Шифруем MD5 нашего сертификата с помощью Base64, и сравниваем получившийся String с переменной st.
Что такое st? Как его получить? Создать новый метод с возвращением String, и вернуть s
А наглядно можно?
Конечно. Чтобы продемонстрировать работу кода, я создал простое приложение. Чтобы узнать хэш вашей подписи, просто переподпишите его вашей подписью.
Подписи совпадают:
Подписи не совпадают:
Скачать данное приложение и его исходный код можно на канале.