Android - Как вы имеете дело с 9774d56d682e549c? Android ID

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

Но оказывается, что 9774d56d682e549c - это волшебный идентификатор, возвращаемый

Secure.getString(getContentResolver(), Secure.ANDROID_ID);

для большого количества устройств... Кажется, каждый эмулятор, который я построил, имеет тот же идентификатор, и многие другие телефоны других людей (много мотодистов!) и вспыхивающие моды ОС, как правило, возвращают эту же повторяющуюся ценность. Не-MotoDroid/Non-Flashed телефоны, похоже, все дают мне уникальную строку обратно. Но это один из моих БД около 60 раз!

Я собираюсь оптимизировать свое приложение, чтобы проверить эту строку перед регистрацией, но что было бы рекомендуемым способом обращения к ней, чтобы получить другое уникальное значение?

Моя текущая мысль состоит в том, чтобы проверить это, создать EXTREMELY LARGE случайное значение, хешировать его, а затем сохранить, чем в SharedPreferences, а затем либо использовать ANDROID_ID или тот, который хранится в sharedprefs (если пользовательский телефон дает значение). У кого-нибудь есть лучшие идеи, или это кажется достаточно прочным, чтобы смягчить эту сумасшедшую ошибку?

Ответы

Ответ 1

Взгляните на статью Идентификация приложений. Вы не можете полагаться на ANDROID_ID.

Лучшим решением является создание пользовательского идентификатора с помощью:

String id = UUID.randomUUID().toString();

Ответ 2

Это явление, а также этот поток Stackoverflow обсуждались на summercon 2012 Oberheide и Miller, которые недавно расчленили Google Bouncer: http://jon.oberheide.org/files/summercon12-bouncer.pdf

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

Ответ 3

Если вы хотите создать тот же формат, что и реальный ANDROID_ID s, вы можете использовать тот же метод, который использует здесь:

private static String generateAndroidId() {
    String generated = null;
    try {
        final SecureRandom random = SecureRandom.getInstance("SHA1PRNG");
        random.setSeed( (System.nanoTime() + new SecureRandom().nextLong()).getBytes() );
        generated = Long.toHexString(random.nextLong());
    } catch (NoSuchAlgorithmException e) {
        Log.e(TAG, "Unexpected exception", e);
    }
    return generated;
}

Выходы: 9e7859438099538e

Ответ 4

Хотя это не так, такие вещи, как SDK Google AdMob, используют разрешение android.permission.READ_PHONE_STATE для чтения номера телефона устройства и т.д.

Вот некоторая полезная, связанная информация в следующем сообщении в блоге: http://strazzere.com/blog/?p=116