Столкнулись с проблемами при генерации строки 11 хеш-ключей, которая указана в официальной документации по SMS Retriever API

мой apk отлично работает в режиме отладки. но когда я подписал apk с режимом выпуска, то не работает автоматическая отправка смс.

затем я ищу, я обнаружил, что мне нужно сгенерировать хеш-ключ в официальной документации https://developers.google.com/identity/sms-retriever/verify#generating_a_one-time_code

где я нашел два метода 1> по подписи помог класс - я использовал, но не работает 2> второй по следующей команде

keytool -exportcert -alias MyAndroidKey -keystore MyProductionKeys.keystore | ххд -р | tr -d "[:пробел:]" | echo -n com.example.myapp cat | ша256сум | tr -d "[:space:]-" | xxd -r -p | база64 | вырезать -c1-11

но у меня команда xxd не найдена

затем я ищу в стеке, затем я запускаю команду в git bash, команда запускается, но этот хеш-ключ все еще не работает

1
0
1 327
2

Ответы 2

С помощью этого кода было бы проще сгенерировать хэш.

Просто позвоните ниже линии и распечатайте свою подпись.

ArrayList<String> sigList = (new AppSignatureHelper(this)).getAppSignatures()

Ссылка на код: https://github.com/googlesamples/android-credentials/blob/master/sms-verification/android/app/src/main/java/com/google/samples/smartlock/sms_verify/AppSignatureHelper.java

Обновлять:

Хэш-код для отладочной и релизной версии будет отличаться. Убедитесь, что вы используете хэш-код конкретного приложения для otp-сообщения с требуемым форматом.

AppSignatureHelper предоставит хэш-код, с помощью которого будет подписан apk. Создайте apk выпуска и напечатайте хеш-код в журнале, чтобы получить хэш-код конкретного выпуска.

Обновлять:

Другой подход к генерации с помощью команды, упомянутой в: https://developers.google.com/identity/sms-retriever/verify#computing_your_apps_hash_string

Однако, если вы используете окна, это может не сработать, так как у вас нет двоичного кода (команды), такого как xxd или tr. в этом случае вам нужно скачать эти exe-файлы откуда-то еще.

Если вы используете git, вы можете найти их в «C:\Program Files\Git\usr\bin\», в этом случае выполните следующие действия.

  1. Добавьте путь «C:\Program Files\Git\usr\bin\» в переменные среды.
  2. Перезапустите командную строку. поэтому xxd и tr начинают работать в приглашении.
  3. примените указанную команду в ссылке.

keytool -exportcert -alias MY_ANDROID_KEY -keystore MY_PRODUCTION_KEY | xxd -p | tr -d "[:space:]" | echo -n MY_PACKAGE_NAMEкошка| sha256sum | tr -d "[:space:]-" | xxd -r -p | base64 | cut -c1-11

Где в команде

  • замените MY_ANDROID_KEY псевдонимом вашего ключа
  • замените MY_PRODUCTION_KEY на путь к вашему хранилищу ключей (некоторые xyz.jks)
  • замените MY_PACKAGE_NAME на имя вашего пакета

    1. вы получите 11-символьный хеш-ключ. Ура.

Здесь, если вы столкнулись с ошибкой, такой как tr: write error: Illegal seek, вы можете вызвать cammand до tr как ->

keytool -exportcert -alias MY_ANDROID_KEY -keystore MY_PRODUCTION_KEY | xxd -p | tr -d "[:space:]"

в этом случае вы получите строку подписи длиной около 1800+ символов. передайте пакет и строку подписи хэш-методу AppSignatureHelper, он вернет ваш ключ.

(Здесь, если в конце вы используете AppSignatureHelper, я предлагаю использовать только этот первый подход)

я уже упоминал, что использовал этот класс, но вы все же скопируйте и вставьте класс, сначала прочитайте мой вопрос

indrajeet jyoti 20.02.2019 07:06

Что вы имели в виду под неработающим кодом вспомогательного класса подписи. Код для отладки и выпуска приложения будет отличаться. Убедитесь, что вы используете хэш-код выпуска приложения в сообщении otp.

bhumik 20.02.2019 07:12

спасибо, но не могли бы вы прислать мне разные ссылки для режима отладки и выпуска этого класса. когда я искал, нет определенного класса для режима выпуска и отладки.

indrajeet jyoti 20.02.2019 07:18

нет нужды. Он будет читать из подписи, с помощью которой подписан apk. Распечатайте этот код в журнале после сборки apk в режиме выпуска.

bhumik 20.02.2019 07:20

Братан, которого я уже использовал, хэш-ключ такой же, как и при подписании apk в режиме отладки и выпуска. И как студия Android знает об apk, она знает только код. какое влияние на режим отладки или выпуска. апк совсем другой

indrajeet jyoti 20.02.2019 07:33

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

bhumik 20.02.2019 07:39

apk — это совершенно другое, предположим, я правильно сгенерировал подписанный apk, а не то, как android stuido запускает вспомогательный класс подписи в соответствии с режимом отладки или выпуска. Поскольку я знаю, что Android-студия не имеет никакого влияния на релиз или отладку apk, она только компилирует или запускает код.

indrajeet jyoti 20.02.2019 07:47

означает, что, по вашему мнению, сначала я должен сгенерировать подписанный apk, а затем установить этот подписанный apk на телефон, а затем подключить этот телефон к студии Android с помощью USB, а затем распечатать журнал, который я сделал. но та же хеш-строка

indrajeet jyoti 20.02.2019 10:17

@indrajeetjyoti Возможно, тогда релизный apk не собран должным образом. Проверьте обновленный ответ, если он может помочь.

bhumik 22.02.2019 06:34
import android.content.Context;
import android.content.ContextWrapper;
import android.content.pm.PackageManager;
import android.content.pm.Signature;
import android.util.Base64;
import android.util.Log;
import java.nio.charset.StandardCharsets;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.ArrayList;
import java.util.Arrays;

public class AppSignatureHelper extends ContextWrapper {

    private static final String TAG = "AppSignatureHelper";
    private static final String HASH_TYPE = "SHA-256";
    public static final int NUM_HASHED_BYTES = 9;
    public static final int NUM_BASE64_CHAR = 11;

    public AppSignatureHelper(Context context) {
        super(context);
    }

    /**
     * Get all the app signatures for the current package
     */
    public ArrayList<String> getAppSignatures() {
        ArrayList<String> appCodes = new ArrayList<>();

        try {
            // Get all package signatures for the current package
            String packageName = getPackageName();
            PackageManager packageManager = getPackageManager();
            Signature[] signatures = packageManager.getPackageInfo(packageName,
                    PackageManager.GET_SIGNATURES).signatures;

            // For each signature create a compatible hash
            for (Signature signature : signatures) {
                String hash = hash(packageName, signature.toCharsString());
                if (hash != null) {
                    appCodes.add(String.format("%s", hash));
                }
            }
        } catch (PackageManager.NameNotFoundException e) {
            Log.e(TAG, "Unable to find package to obtain hash.", e);
        }
        return appCodes;
    }

    private static String hash(String packageName, String signature) {
        String appInfo = packageName + " " + signature;
        try {
            MessageDigest messageDigest = MessageDigest.getInstance(HASH_TYPE);
            messageDigest.update(appInfo.getBytes(StandardCharsets.UTF_8));
            byte[] hashSignature = messageDigest.digest();

            // truncated into NUM_HASHED_BYTES
            hashSignature = Arrays.copyOfRange(hashSignature, 0, NUM_HASHED_BYTES);
            // encode into Base64
            String base64Hash = Base64.encodeToString(hashSignature, Base64.NO_PADDING | Base64.NO_WRAP);
            base64Hash = base64Hash.substring(0, NUM_BASE64_CHAR);

            CommonUtils.base64Val = base64Hash;
            Log.e("base64Val",base64Hash);
            Log.d(TAG, String.format("pkg: %s -- hash: %s", packageName, base64Hash));
            return base64Hash;
        } catch (NoSuchAlgorithmException e) {
            Log.e(TAG, "hash:NoSuchAlgorithm", e);
        }
        return null;
    }
}

Вы можете использовать base64hash для сборки отладки, и если вы запускаете приложение, создайте подписанный APK и используйте значение, сгенерированное из подписанного APK.

Не забудьте вызвать этот класс из основного приложения oncreate().

 AppSignatureHelper appSignatureHelper = new AppSignatureHelper(this);
    appSignatureHelper.getAppSignatures();

как вы генерируете ценность из подписанного apk

indrajeet jyoti 20.12.2019 07:58

и ключ, сгенерированный из приведенного выше кода, не используется для API-интерфейса sms-ретривера. спасибо за предложение

indrajeet jyoti 20.12.2019 08:01

Привет, Индраджит, я использовал API-интерфейс для извлечения SMS в своем приложении и использую то же значение, сгенерированное из приведенного выше кода, и загрузил приложение в магазин игр, и оно работает отлично.

apurv thakkar 20.12.2019 09:47

его невозможный алгоритм генерации хеш-ключа ретривера смс совершенно другой

indrajeet jyoti 20.12.2019 10:08

обратитесь к этому документу

indrajeet jyoti 20.12.2019 10:09

Есть несколько способов создать это. Обратитесь к этому блогу. androidwave.com/automatic-sms-verification-android

apurv thakkar 20.12.2019 10:20

Другие вопросы по теме