Как программно прочитать отпечаток SHA и MD5 в Android

Здравствуйте, я хочу программно прочитать значение отпечатка SHA и MD5 хранилища ключей моего приложения, из которого оно было подписано.

Я возьму значение SHA или MD5 в качестве ключа безопасности. Этот ключ я буду использовать в коде, чтобы что-то зашифровать и расшифровать на стороне сервера.

Есть ли способ найти это или есть ли способ сделать то же самое, используя другой хороший подход. Это должно быть таким образом, чтобы никто другой не мог найти этот ключ.

Заранее спасибо.


person N Sharma    schedule 31.01.2015    source источник


Ответы (4)


попробуй это:

/**
 * 
 * @param pkg packageName
 * @return
 */
public String getSingInfo (String pkg) {
    try {
        PackageInfo packageInfo = getPackageManager().getPackageInfo(pkg, PackageManager.GET_SIGNATURES);
        Signature[] signs = packageInfo.signatures;
        Signature sign = signs[0];
        String s = getMd5(sign);
        return "md5:" + s ;
    } catch (Exception e) {
        e.printStackTrace();
    }

    return "";
}



private String getMd5 (Signature signature) {
    return encryptionMD5(signature.toByteArray());
}

public static String encryptionMD5(byte[] byteStr) {
    MessageDigest messageDigest = null;
    StringBuffer md5StrBuff = new StringBuffer();
    try {
        messageDigest = MessageDigest.getInstance("MD5");
        messageDigest.reset();
        messageDigest.update(byteStr);
        byte[] byteArray = messageDigest.digest();
        for (int i = 0; i < byteArray.length; i++) {
            if (Integer.toHexString(0xFF & byteArray[i]).length() == 1) {
                md5StrBuff.append("0").append(Integer.toHexString(0xFF & byteArray[i]));
            } else {
                md5StrBuff.append(Integer.toHexString(0xFF & byteArray[i]));
            }
        }
    } catch (NoSuchAlgorithmException e) {
        e.printStackTrace();
    }
    return md5StrBuff.toString();
}
person NateZh    schedule 07.08.2017

  1. Найдите путь к APK-файлу вашего приложения, вызвав Context.getPackageCodePath().
  2. Скопируйте этот APK в доступный для записи каталог по вашему выбору.
  3. Используйте apk-parser, чтобы получить необходимую информацию из APK (см. пример ниже).

Эта библиотека способна распаковать файл APK и проанализировать все его содержимое. Пример, извлеченный из страницы Github apk-parser, адаптированный к вашим потребностям:

try {
  ApkParser apkParser = new ApkParser(new File(filePath));
  ApkSignStatus signStatus = apkParser.verifyApk(); // not needed
  List<CertificateMeta> certs = apkParser.getCertificateMetas();
  for (CertificateMeta certificateMeta : certs) {
    System.out.println(certificateMeta.getCertMd5());
  }
} catch (Exception e) {
  e.printStackTrace();
}
person Sebastiano    schedule 03.02.2015
comment
Может ли этот код помочь мне получить другое приложение, такое как facebook MD5, значение хранилища ключей, из которого оно было подписано? - person N Sharma; 03.02.2015
comment
Это было бы нарушением безопасности. Вы можете получить доступ только к частному каталогу вашего приложения, а не к чужому. Для этого требуются root-права. - person Sebastiano; 03.02.2015
comment
Мм понятно. Что вы имели в виду Скопируйте этот APK в доступный для записи каталог по вашему выбору? - person N Sharma; 03.02.2015
comment
Я не уверен в этом, но apk-parser может понадобиться доступный для записи каталог, чтобы извлечь содержимое APK. Итак, просто скопируйте APK-файл в каталог внешнего хранилища (обычно /sdcard) и укажите apk-parser этот путь. - person Sebastiano; 03.02.2015
comment
Можно ли разобрать APK любого приложения?? Если я подпишу свой APK с помощью некоторого хранилища ключей, могу ли я получить отпечаток SHA 1 этого сертификата APK, используя описанный выше метод? - person Bharath; 08.02.2015
comment
Да, поскольку файл манифеста не зашифрован, он имеет только цифровую подпись. Однако вы не сможете программно получить доступ к APK других приложений, как я упоминал в предыдущих комментариях. - person Sebastiano; 08.02.2015

Ниже добавлено решение на тот случай, если кто-то ищет его впервые и не знает, как получить его из студии. Много раз мы ищем и получаем ссылки на предложения. Самый простой способ

  1. Откройте Android-студию
  2. Откройте свой проект
  3. Нажмите на Gradle (на правой боковой панели вы увидите панель Gradle)
  4. Нажмите «Обновить» (нажмите «Обновить» на панели Gradle, вы увидите список скриптов Gradle вашего проекта)
  5. Нажмите на свой проект (список имен ваших проектов (корень))
  6. Нажмите Задачи
  7. Нажмите на андроид
  8. Дважды щелкните на signingReport (вы получите SHA1 и MD5 на панели запуска)

Проверьте скриншот ниже:

введите здесь описание изображения

person Tara    schedule 18.01.2016
comment
это не программно - person Chad Bingham; 01.10.2017
comment
Я согласен с @Chad Bingham. Прошло уже больше года. Мало того, этот метод работает только с хранилищем ключей разработчика, а не с хранилищем ключей издателя или любого другого внешнего хранилища. - person Abhinav Saxena; 03.10.2018
comment
Хоть и не программно, но решил мою проблему в несколько кликов! Кроме того, если вы уже добавили ключи выпуска в свой build.gradle, это также распечатает их отпечатки пальцев. - person Salman Khakwani; 21.11.2019

person    schedule
comment
Вы уверены в ответе? Вы пробовали то же самое с Amazon Login SDK? - person Abhinav Saxena; 03.10.2018
comment
Это даст вам SHA вместо MD5. @NateZh ответил на него хорошо. - person Abhinav Saxena; 03.10.2018