2013-08-10 1 views
4

모바일 앱이 유효한 고객에 의해 사용되는지 여부를 결정하는 편리한 방법을 구현해야합니다. 고객은 휴대 전화를 분실하면 운영자에게 연락하여 SIM 카드를 잠그는 것이 분명하다고 말했습니다.Android 애플리케이션의 인증 방식 : SIM 카드가 잠겨 있거나 다른 앱에 의해 잠겨있을 때 앱이 작동하지 않음

따라서 SIM 카드 유효성에 대한 인증을 바인딩하는 것이 자연스러운 것처럼 보입니다 (올바른 SIM이 있고 잠겨 있지 않은 한 앱이 작동 함). 그런 다음 손실의 경우 고객은 SIM 카드를 잠글 필요가 있습니다. SIM 카드는 인터넷 뱅크가 거래 승인을위한 SMS를 휴대 전화로 전송하기 때문에 어쨌든 할 수 있습니다.

나는 SIM 카드 관련 데이터를 읽으려고했지만 일부 전화기에서만 작동하며 다른 사람에서는 작동하지 않습니다 (때때로 IMEI 번호 대신 빈 문자열이 표시되기도 함).

나는 사용자에 대한

  1. 쉽게 인증 메커니즘, 구현할 수있는 방법 (생성하는 사용자를 필요로하지 않습니다/새 암호를 입력),
  2. 는 현재 여부 정보와 응용 프로그램을 제공합니다 SIM 카드가 삽입 된
    1. 응용 프로그램의 처음 시작시에 있었던 SIM과 동일하고
    2. 이 잠겨 있지 않습니까?

이 불가능하면, 어떤 인증 대안이 (떨어져 SMS 확인과 이메일/비밀번호, 전화 번호에서)입니까?

업데이트 1 (11.08.2013 14:17 MSK) : 확실한 해결 방법 중 하나는 전화 번호를 로그인 이름으로 사용하고 서버에서 생성 한 6 자리 숫자를 암호로 사용하는 것입니다.

그런 다음 인증은 다음과 같이 작동합니다 : 첫 번째 실행에서

  1. 을, 사용자는 자신의 휴대 전화 번호를 입력합니다.
  2. 서버에서 6 자리 암호와 함께 메시지 (SMS)를 보냅니다.
  3. 사용자가 비밀번호를 입력하면 앱이 작동하기 시작합니다.
  4. 정기적으로 앱에서 사용자에게 비밀번호를 갱신하도록 요청합니다 (새 비밀번호는 SMS를 통해 전달됩니다).

이 옵션에 대해 어떻게 생각하십니까?

어떻게 든 개선 될 수 있습니까?

+0

IMEI는 SIM/사용자 데이터가 아닌 장치를 식별합니다. – Rajesh

+1

두 번째 방법은 위험합니다. 자신의 전화를 잃어 버렸습니까? 귀하의 접근 방식은 이중 인증의 일부이지만, 가장 중요한 일, 즉 공유 비밀을 놓쳤습니다. Android 키 스토어 사용을 고려해 보시기 바랍니다. 사용자 PIN 코드로 잠그고 사용자 시도 횟수를 계산합니다.지정된 횟수의 추적 후에 사용자 자격 증명을 삭제하거나 시도를 지연하십시오. 이 SMS 접근법의 위에는 그것을 강화할 수 있습니다. 행운을 빕니다! – samson

+0

@samson 감사합니다. 분실했을 경우 사용자의 전자 메일 주소를 통신 장소로 사용하는 것에 대해 어떻게 생각합니까 (사용자가 전화를 분실했을 때 응용 프로그램을 차단하는 전자 메일을 보냈습니다)? –

답변

5

SIM 속성을 사용하여 앱을 잠그고 해당 속성을 앱 잠금 해제를 위해 표시해야하는 경우 앱에 해당 속성을 저장할 위치 (하드 코딩, 데이터베이스, 파일, 환경 설정 ...)를 생각해 보았습니다. ? 아니면 확인을 위해 서버에 문의 하시겠습니까? 두 가지 방법 모두 가능한 보안 결함으로 복잡한 솔루션이 될 수 있습니다. SIM 일련 번호는 고유하지만 동시에 공개이므로이 속성을 사용하여 앱을 잠글 수 없습니다.

TelephonyManager class은 SIM 속성에 액세스하기위한 게이트웨이입니다 (이 클래스는 여러 가지 방법으로 사용자 개인 정보를 노출합니다).현재 SIM에 암호화 작업을 수행하기 위해 노출 된 Android crypro API는 없습니다. 그러나 고객이 운영자에게 연락 할 수 있으므로 운영자에게 귀하의 앱에 서명하도록 요청할 수 있습니다. 이 경우 SIM 카드를 안전한 요소로 사용할 수있는 방법이있을 수 있습니다. this 스레드에 대한 토론이 있습니다. 제한된 수의 시도를 기반으로하는 PIN 코드는 앱에 액세스하기위한 간단한 인증을 구현하는 또 다른 방법입니다. SIM 카드를 사용하지 않고 애플리케이션 계층에서이를 구현할 수 있습니다.

희망이 도움이됩니다.

+0

광고 * 앱에서 해당 속성을 저장할 위치 * : 이러한 데이터를 서버에 저장하려고했습니다. 즉, 사용자가 앱을 설치하면 SIM 번호와 같은 일부 식별 정보가 내 서버로 전송됩니다. 그런 다음 앱이 시작될 때마다 서버에 접속하여 최신 식별 정보를 전송합니다. 서버는 현재 데이터를 처음 실행 한 데이터와 비교하여 Android 클라이언트에게 모든 것이 정상이라고 알려줍니다. 내 Android 앱은 인터넷에 자주/영구적으로 액세스해야합니다. –

0

괜찮습니다. 대부분의 흐름이 마음에 이미 정해져있는 것처럼 보입니다. 나는 몇 가지 특정 일을 추가하고 :

1. 등록

사용자 (에서 명시 적으로 물리적으로 SIM 카드의 측면에 인쇄 된 SIM 일련 번호를 읽고 당신이 일련 번호를 전달해야 할 것이다 사용자를 수동 또는 오프라인으로 등록하는 경우) 또는 사용자가이 특정 SIM 일련 번호를 입력하여 온라인으로 등록 할 수 있습니다 (등록 프로세스가 온라인 및 사용자 중심 인 경우). 이것은 단지 한 번 등록 될 것입니다.

SIM 카드를 휴대 전화에서 꺼내지 않고도 SIM 일련 번호를 찾을 방법이 확실하지 않습니다. 더 많이 탐색 할 수 있습니다.

2. 인증 지금

사용자가 응용 프로그램을 실행할 때마다, 당신은 SIM 카드를 등 SIM 카드의 일련 번호, 운영자 코드, 운영자 이름, 운영자 국가 코드와 같은 관련 정보를 읽고이 정보를 통신 할 수 있습니다 웹 서버에 인증을 요청합니다.

이 내용을 얻으려면 함수 getSimOperatorName(), getSimSerialNumbe(), getSimCountryIso()TelephonyManager으로 사용해야합니다.

@rajesh가 이미 IMEI no. 는 SIM 카드가 아닌 장치를 식별하는 데 사용되므로 SIM 카드 별 인증을 원하면 아무 쓸모가 없습니다.

3. 인증 외에

을 확인, 당신은 (응용 프로그램이 사용될 때 어쩌면마다 특정 시간 간격 후 ,, 또는 시간 만에) SIM 카드의 상태를 볼 수있는 로직을 구현해야합니다.

당신은 상태를 읽어 TelephonyManager의 getSimState() 기능을 사용해야합니다 :

SIM_STATE_NETWORK_LOCKED 일 - SIM은 네트워크 운영자에 의해 잠겨 있음을 알려줍니다. . (offcourse 사용자는 SIM 이벤트를 잃은 후 SIM을 잠그는보고 SIM_STATE_ABSENT은 틀림 때 - SIM 카드가없는 것을 알려줍니다 따라서

당신이 사용자에게 적절한 메시지를 표시하여 응용 프로그램을 종료 할 수 있습니다

..

이 접근법을 수정하여 요구 사항에 따라 사용할 수 있습니다.

+0

감사합니다. 모든 전화에서 작동하지 않기 때문에 getSimOperatorName(), getSimSerialNumbe(), getSimCountryIso() 메서드를 사용할 수 없습니다. 두 개의 테스트 용 전화가 있으며이 메서드는 그 중 하나에서만 무언가를 반환합니다. –

+0

매니페스트 파일에 'android.permission.READ_PHONE_STATE' 권한을 사용하시기 바랍니다. 또한이 기능이 작동하는 전화와 어떤 전화가 어떤 것을 반환하지 않는지에 대해 언급 할 수 있습니까? – AnniJais

+0

예, 사용 권한을 사용하고 있습니다. Alcatel One Touch 4030D에서 작동하며 Highscreen Spark에서는 작동하지 않습니다. –

관련 문제