2014-05-14 1 views
0

내 서버에 수만 건의 RESTful 웹 서비스 요청을하는 모바일 앱 (Android)이 있습니다.인증 된 클라이언트 (예 : PGP/GPG 일 수도 있습니다.)

여러 가지 이유로, 특히 내 서버가 하드웨어 사양과 API 응답을 통해 내 앱으로 전송되는 값 비싼 라이센스가 부여 된 콘텐츠의 형태로 제한된 리소스를 보유하고 있기 때문에 내 앱만 내 웹 서비스에 대한 API 요청을 성공적으로 수행 할 수 있는지 확인하십시오.

나는 구글이 신뢰할 수있는 제 3 자 서버 (예를 들어, 당신의 API 서버)에 verify backend calls from Android하는 방법을 가지고 있기 때문에 적어도 안드로이드 기반의 시스템,이 작업을 수행하기 위해 적어도 이론적으로 가능하다 알고있다. OAuth를 기반으로하며 모든 Android 기기가 설정되어 있어야하는 필수 Google 계정과 연결되어 있다고 생각합니다.

실제로 구현이 끝났지 만 사용자 기기에 설치해야하는 최신 버전의 Google Play 서비스에서만 제공되는 GoogleAuthUtil 메커니즘 만 필요 했으므로 약 한 달 후에이를 포기했습니다. 대부분의 내 사용자가 업그레이드에서 제외됨). 또 다른 문제는 기기에 여러 개의 Google 계정이있을 수 있기 때문에 어느 것이 옳았는지 추측해야하거나, 사용자가 선택하라는 프롬프트/귀찮아하는 것입니다. 이러한 옵션은 절대적으로 의문이었습니다.

PGP/GPG와 같은 일종의 공개 키 암호화를 사용하는 것이 처음 생각되었습니다. 앱에 내 API의 공개 키를 포함합니다 (보안 성이 보장되지 않는다는 사실을 알고 있습니다. 결국 PUBLIC 키입니다). 그리고 API 요청에 이미 서명 한 것 이외에도 전체 내용을 암호화 할 수있었습니다. API의 공개 키

며칠 후 (마침내) 저는 마침내 앉아서 설계 및 구현 세부 사항을 해설 할 시간을 갖게되었습니다. API의 공개 키 이론적으로는 다른 시그니처 관련 로직을 추출 할 수 있기 때문에 성공적인 해커는 API 서버가 개인 키로 해독하고 더 현명하지 못한 "정품"API 요청을 쉽게 생성 할 수 있습니다.

:

나는 나보다 훨씬 똑똑 사람들이 주제에 대한 몇 가지 정말 좋은 답변이 programmers.stackexchange에 게시 된이 두 가지 질문에 건너 않았다

내가 모은 것에서 나는 그 말을 기꺼이 예 이론적으로 가능하다 (그냥 G를 보라. oogle의 GoogleAuthUtil OAuth 기반 백엔드 검증 시스템). 그러나 API를 올바르게 구현/유지 관리하는 것은 엄청나게 고통 스럽습니다. API가 핵 발사 코드를 제공하지 않는 한, 사기꾼의 90 %를 예방할 수있는 최선의 방법으로 요청을 난독 화하는 것이 현명합니다.

만약 한 MOD가이 질문을 삭제하거나 그것을 복제물로 표시하고 싶다면, 언제든지 자유롭게 말해주세요. OTOH, 다른 사람이 똑같은 것을 궁금해하면 아마도 도움이 될 것입니다. 프로그래머에게 묻지 않을 것 같아요. 스탁 교환,하지만 대부분의 리드는 그 질문에서 발견되었습니다. 그리고 보안 전문가는이를보고 보안이 비교적 쉽고 효율적으로 이루어질 수있는 방법을 설명 할 수 있습니다.;)

+2

앱을 디 컴파일하여 공개 키와 관련 코드를 함께 추출하면 어떻게됩니까? 난독 화를 통해 앱 수준으로 API를 사용하는 것이 더 어려워지는 것을 막을 수는 없습니다. – Robert

+0

많은 생각을 해주었습니다. API의 공개 키 (공개 키는 공개 될 수 없다고 생각하지도 않았고 "정품"API 호출 생성)를 얻었습니다. 나는 그 공동체가 제공해야하는 것을보기 위해 이곳에 왔습니다. 나는 서버 측에서 API 요청 원산지 (예 : 앱)의 신빙성을 보장 할 수 없다는 감정에 대해 대단히 동의하지 않습니다. SSL을 사용하는 이유 중 하나는 말하고있는 컴퓨터가 자신이 주장하는 사람이라는 것을 합리적으로 확신하기 위해서입니다. –

+0

의견에 제약이 있기 때문에 자신과 같은 보안 초심자에게 정교하게 설명하고 싶다면 실제로 왜 당신이 맞는지; 승인 된 앱에서만 API가 사용되는 것을 방지하는 것은 불가능합니다. 질문에서 내 제안이 트릭을하지는 않을 것이라는 것을 이해하지만 Android는 신뢰할 수있는 서버에서 앱의 API 요청을 확인할 수있는 시스템을 갖추고 있습니다. 실제로 몇 달 동안 사용했지만 사용자가 Google 계정에 로그인해야하거나 악화 될 경우 사용할 계정을 추측해야했습니다. PGP/GPG 서명을 연구 할 것입니다. 그 방향으로 희망을 갖고 있나? –

답변

1

클라이언트 쪽 공용/개인 키를 생성하지 않고 서버 공개 키를 사용하여 클라이언트 개인용 키를 서버로 보내는 이유는 무엇입니까? 일종의 요청 식별자를 사용하여 서버 측에 클라이언트 개인 키를 저장하고 예를 들어 사용자 자격 증명을 보내기 위해 클라이언트 공개 키로 추가 요청을 암호화 할 수 있습니다.

요청은 사용자의 인터페이스를 인식하는 모든 종류의 클라이언트에서 가져올 수 있지만 적어도 요청은 유효한 자격 증명이있는 사용자의 요청 일 수 있습니다. 그렇지 않으면 실패합니다 (여전히 잘못된 요청을 처리 할 리소스가 있어야 함).

이게 민감합니까? 나는이 주제에 대해 정말 새로운 것이지만, 나는 또한 정말로 잘 정의 된 해결책에 대해 언급하지 않고 수많은 기사를 읽었습니다.

+0

개인적으로 Java의 실용적인 솔루션을 찾고 있습니다. –

관련 문제