2015-01-31 1 views
17

내 모바일 애플리케이션 용으로 안정적인 API를 만들고 있습니다.모바일 앱에 대한 사용자 인증없이 비공개 REST API를 보호하는 가장 좋은 방법

APP와 웹 서버 간의 통신은 REST에서 이루어져야합니다. 이 api는 비공개이어야하며 내 앱만 성공적인 결과를 얻기 위해 호출 할 수 있어야합니다.

힘든 부분은 내 앱에 사용자 아이디와 비밀번호가 필요 없기 때문에 기본 사용자 인증없이 모바일 앱으로 API를 어떻게 제한 할 수 있을지 모르겠다.

내가 생각하는 해결책 중 하나는 하드 코드 문자열을 모바일 앱이 SSL을 통해 암호화 형식으로 전달하는 편안한 URL을 사용할 때 포함시키는 것입니다. 하지만이게 아주 나쁜 해결책 인 것 같습니다.

그런 상황에서 최선의 해결책이 무엇인지 제안 해주십시오.

+0

http://stackoverflow.com/questions/6134082/restful-web-service-how-to-authenticate-requests-from-other-services – Subin

+3

토론에서 볼 수 있듯이, 당신이 무엇을 요구하는지는 거의 불가능합니다. 우리는 응용 프로그램이 아닌 사용자를 인증 할 수 있습니다. 가능한 접근법은 일종의 공유 비밀입니다. 그러나 클라이언트 응용 프로그램이 리버스 엔지니어링 할 수있는 경우 안전하지 않으며 아무 것도 성취하지 못합니다. – Subin

+0

리버스 엔지니어링 (Reverse Engineering)과 관련해서는 어떠한 반대도 없습니다. 그러나 그들의 직업을 더욱 어렵고 어렵게 만드는 것은 매우 쉽습니다. 내 비밀을 몇 가지 복잡한 수학 공식/함수 형태로 포함한다면 어떨까요? – nasirbest

답변

6

은 해시 기반 메시지 인증 코드 (HMAC) 메커니즘을 살펴보십시오 불구하고 응용 프로그램을 설계하고 토큰을 복제 취소 할 수 있습니다.

위키 백과 링크 : http://en.wikipedia.org/wiki/Hash-based_message_authentication_code

클라이언트 (모바일 앱)은 REST의 웹 서비스 클라이언트와 개인/암호화 키를 식별하는 공공 API 키가 필요합니다. 공개 API 키는 HTTP 요청과 함께 보낼 수 있습니다. 공개되어 누구나 볼 수 있습니다. 그러나 개인 키는 요청과 함께 보내지 않아야하며 서버와 클라이언트 만 알고 있어야합니다. 이 키는 대신 서버로 보내지는 해시 된 메시지를 생성하는 데 사용됩니다. HMAC는 SHA1/MD5 알고리즘을 사용하여 생성 될 수 있습니다.이 알고리즘은 서버와 클라이언트가 알고있는 알고리즘으로 생성되어야하며 마지막으로 개인 키로 생성되어야합니다.

+0

하지만 한 가지 질문이 있습니다. 브라우저가 아닌 모바일 앱 코드에 포함해야하는 비공개 키를 제안 하시겠습니까? 나는 누군가 코드를 리버스 엔지니어링 할 수 있다면 코드를 입력하면 어디에서 개인 키를 저장해야하는지 실제로 이해하지 못합니다. 이 접근법은 데이터를 스니핑하는 스파이로부터 나를 구할 수 있다고 생각합니다. – wolvorinePk

+0

네가 맞습니다. 코드/설정 파일에 비공개 키를 저장하면 그 기회가 있으며, 방탄으로 만드는 것이 불가능하다고 생각합니다. 그러나, 당신은 일을 더 어렵게 만들 수 있습니다. 나는 일반적인 기술에 익숙하지 않지만 다음 질문을 확인하십시오 : http://stackoverflow.com/questions/8184492/best-way-to-secure-android-app-sensitive-data. 희망이 도움이됩니다! –

0

timestamp + appId + 서버에서 복제 할 수있는 다른 값으로 만들어진 복잡한 토큰을 앱에 생성하고이를 사용하여 각 요청의 헤더에서 인증하는 것이 좋습니다.

예를 들어 db에 가상 "사용자"를 만들어 deviceToken에 저장하고 알고리즘에 사용할 수 있습니다.

개인적으로 하나의 API 요청을 public으로 유지합니다.이 요청은 타임 스탬프 getter로 300 초 이내에 사용할 서버의 타임 스탬프를 반환합니다.

각 요청 전에 타임 스탬프를 가져 와서 만든 토큰을 보내고 서버에 복제하여 요청을 인증하십시오.

평범한 해커는

3

앱의 올바른 내장 키는 패킷 스니퍼 또는 다양한 다른 기술로 쉽게 검색 할 수 있습니다. 다음 지침을 사용하여이 문제를 극복 할 수 있습니다.

  • 클라이언트 (앱)을 거부합니다 API를
  • 서버를 필요 호출하지만 응답은 임의 해시 (= 도전)를 포함하는 문자열을 보내드립니다.
  • 클라이언트는
  • 클라이언트가 다시 동일한 API를 호출합니다 (= 다이제스트) 새로운 해시를 생성하기 위해 (이미 응용 프로그램에 포함 된) 다른 문자열 (= 비밀번호)와 함께 해당 문자열을 사용하지만 이번에는 새로 사용 생성 된 다이제스트를 인증 매개 변수로 사용합니다.
  • 서버는 다이제스트 검증되고 FYI

진행한다 : 상기 언급 된 표준 절차 Widly는 허용되고 Digest Authentication로 지칭된다. 도움이 더 필요하면 Google에 "android http digest authentication"을 요청하십시오.

+0

나는 그것이 좋다고 생각하지만 공개 키와 개인 키 암호를 추가하면 보안을 강화할 수있다. – wolvorinePk

+0

동의! 다이제스트 인증은 구현하기가 쉽고 공정한 보안을 제공한다고 생각합니다. 그러나 당신이 APP에 대해 매우 신중하다면 키 기반의 암호화 된 통신을 사용해야합니다. – nasirbest

+2

모바일 앱을 계속 검사하여 다른 문자열 (= 비밀번호)을 찾을 수 있습니다. – Westy92

관련 문제