2013-08-10 12 views
4

Мне нужно реализовать удобный способ определить, используется ли мобильное приложение действительным клиентом или нет. Мои клиенты сказали мне, что если они потеряют свой мобильный телефон, они обязательно свяжутся с оператором и заблокируют SIM-карту.Схема аутентификации для приложения для Android: когда SIM-карта заблокирована или заменена другим, приложение перестает работать

Таким образом, кажется естественным связать аутентификацию с действительностью SIM-карты (приложение работает до тех пор, пока правильная SIM-карта присутствует и не заблокирована). Затем, в случае потери, клиенту нужно только заблокировать SIM-карту, которую он или она будет делать в любом случае (поскольку интернет-банки отправляют SMS-сообщение для одобрения транзакций на мобильный телефон).

Я попытался прочитать данные, связанные с SIM-картой, но работает только на некоторых телефонах, а не на других (иногда я получаю только пустые строки вместо номера IMEI).

Как я могу реализовать механизм аутентификации, который

  1. легко для пользователя (не требует от пользователя для создания/ввести новый пароль),
  2. обеспечивает приложение с информацией ли в настоящее время вставленная SIM-карта
    1. такая же, как SIM-карта, которая была там при первом запуске приложения и
    2. не заблокирован?

Если это невозможно, то, что проверка подлинности альтернатива существует (кроме электронной почты/пароля и номера телефона с подтверждением SMS)?

Обновление 1 (11.08.2013 14:17 MSK): Одним из очевидных решений является использование номера телефона в качестве имени пользователя и 6-значного числа сгенерированных сервером в качестве пароля.

Затем аутентификация будет работать так:

  1. На первом запуске, пользователь вводит свой номер мобильного телефона.
  2. Сервер отправляет ему или ей сообщение (SMS) с 6-значным паролем.
  3. Пользователь вводит этот пароль, и приложение начинает работать.
  4. Через регулярные промежутки времени приложение просит пользователя обновить пароль (новые пароли доставляются также через SMS).

Что вы думаете об этой опции?

Можно ли как-то улучшить?

+0

IMEI идентифицирует устройство, а не данные SIM/пользователя. – Rajesh

+1

ваш второй подход является рискованным. Что делать, если пользователь Потеря вашего телефона? Ваш подход является частью двухфакторной аутентификации, но вы пропустили самую настоятельную вещь, то есть общий секрет. Я предлагаю вам использовать Android Keystore. Заблокируйте его с помощью pincode пользователя, подсчитайте количество попыток пользователя.Задержать попытку или отбросить учетные данные пользователя после указанного количества трасс. В дополнение к этому подход к SMS может укрепить его. Удачи! – samson

+0

@samson Спасибо. Что вы думаете об использовании адреса электронной почты пользователя в качестве места для связи в случае потери (когда пользователь теряет телефон, он отправляет электронное письмо, которое блокирует приложение)? –

ответ

5

Если вы заблокировали свое приложение с помощью свойств SIM-карты и вам нужны эти свойства для разблокировки приложения, подумали ли вы о том, где хранить эти свойства в приложении (жесткий диск, база данных, файл, настройки, ...) ? Или вы думаете связаться с сервером для проверки? В обоих случаях вы можете оказаться в сложном решении с возможными недостатками безопасности. Серийный номер SIM является чем-то уникальным, но в то же время он является общедоступным, вы не можете полагаться на это свойство, чтобы заблокировать свое приложение.

TelephonyManager class является шлюзом для доступа к свойствам SIM-карты (этот класс также предоставляет пользователям конфиденциальность несколькими способами).На данный момент нет API-интерфейсов для Android, которые могут выполнять криптографические операции на SIM-карте. Но, так как ваш клиент может связаться с оператором, вы можете попросить оператора подписать ваше приложение. В этом случае вы можете использовать SIM-карту в качестве защищенного элемента. Существует обсуждение темы this. PIN-код, основанный на ограниченном числе попыток, - это еще один способ реализовать простую аутентификацию для доступа к вашему приложению. Вы можете реализовать это на уровне приложения без использования SIM-карты.

Надеюсь, это поможет.

+0

Ad * где хранить эти свойства в приложении *: я хотел сохранить эти данные на сервере. То есть, когда пользователь устанавливает приложение, он переносит на мой сервер некоторую идентифицирующую информацию (например, номер SIM-карты). Затем, когда приложение запускается, оно связывается с сервером и отправляет ему текущую идентифицирующую информацию. Сервер сравнивает текущие данные с данными первого запуска и сообщает клиенту Android, что все в порядке. Обратите внимание, что для моего Android-приложения требуется частый/постоянный доступ в Интернет. –

0

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

1. Регистрация

Пользователи должны будут явно прочитать серийный номер SIM-карты, которая физически напечатанный на стороне SIM-карты и должны сообщить об этом серийный номер к вам (в если вы регистрируете пользователей вручную и в автономном режиме) .. или пользователи могут сами регистрироваться в Интернете, введя этот конкретный серийный номер SIM (если ваш процесс регистрации подключен к сети и управляется пользователем). Это будет только однократная регистрация.

Я не уверен ни в каком поиске серийного номера SIM-карты, не вынимая SIM-карту из телефона. Вы можете изучить его больше.

2. Аутентификация

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

Для получения этих деталей вы должны использовать функции getSimOperatorName(), getSimSerialNumbe(), getSimCountryIso() из TelephonyManager.

Обратите внимание, что как @rajesh уже прокомментировал, что IMEI нет. используется для идентификации устройства, а не SIM-карты, поэтому он не нужен, если вы хотите, чтобы аутентификация была специфичной для SIM-карты.

3. Проверка

Кроме аутентификации, вы должны реализовать логику, чтобы увидеть состояние SIM-карты (возможно, после того, как каждый конкретный промежуток времени ,, или только в то время, когда используется приложение).

Вы должны будете использовать getSimState() функцию TelephonyManager для чтения состояния:

SIM_STATE_NETWORK_LOCKED - Сообщает, что SIM заблокирована оператором сети. (Offcourse, когда пользователь должен докладывали заблокировать SIM-карту после того, как SIM потерял событие SIM_STATE_ABSENT -. Сообщает, что SIM-карта отсутствует

Соответственно вы можете выйти из приложения, показывая соответствующие сообщения пользователя

..

Этот подход может быть изменен и использоваться в соответствии с вашими требованиями. Я надеюсь, что это поможет.

+0

Спасибо. Я не могу использовать методы 'getSimOperatorName(), getSimSerialNumbe(), getSimCountryIso()', потому что они не работают на всех телефонах (у меня есть 2 тестовых телефона, и эти методы возвращают что-то только на одном из них). –

+0

Надеюсь, вы используете разрешение - 'android.permission.READ_PHONE_STATE' в файле манифеста. Также не могли бы вы упомянуть, на каком телефоне работают эти функции, и на каком телефоне ничего не возвращается? – AnniJais

+0

Да, я пользуюсь разрешением. Он работает на Alcatel One Touch 4030D, и он не работает на Highscreen Spark. –