webentwicklung-frage-antwort-db.com.de

Der beste Weg, um Private zu sichern REST API ohne Benutzerauthentifizierung für die mobile App

Ich mache einige Restful-APIs für meine mobile Anwendung.

Die Kommunikation zwischen APP und Webserver muss in REST erfolgen. Diese apis sollten privat sein, und nur meine App sollte sie für erfolgreiche Ergebnisse aufrufen können. 

Der schwierige Teil ist, dass in meiner App keine Benutzer-ID und kein Kennwort erforderlich sind. Ich weiß nicht, wie ich die Rest-API mit der mobilen App ohne grundlegende Benutzerauthentifizierung einschränken könnte. 

Eine Lösung, die ich dachte, war, eine Art Hardcode-String einzubetten, damit die mobile App, wenn sie die restful-URL verwendet, diese im verschlüsselten Format über SSL weitergibt. Aber ich weiß, das scheint eine sehr schlechte Lösung zu sein.

bitte vorschlagen, was in einer solchen Situation die beste Lösung sein sollte.

18
wolvorinePk

Schauen Sie sich den HMAC-Mechanismus (Hash-based Message Authentication Code) an.

Wikipedia-Link: http://en.wikipedia.org/wiki/Hash-based_message_authentication_code

Ihr Client (mobile App) benötigt einen public - API-Schlüssel, der den Webservice-Client REST identifiziert, und einen private/cryptographic - Schlüssel. Der öffentliche API-Schlüssel kann zusammen mit der HTTP-Anforderung gesendet werden. Es ist öffentlich und jeder kann es sehen. Der private Schlüssel sollte jedoch niemals zusammen mit der Anfrage gesendet werden und sollte nur dem Server und dem Client bekannt sein. Dieser Schlüssel wird zum Generieren der Hash-Nachricht verwendet, die stattdessen an den Server gesendet wird. Die HMAC kann mit einem SHA1/MD5-Algorithmus generiert werden, einer Nachricht, die von einem Algorithmus generiert werden sollte, den sowohl Server als auch Client kennen, und schließlich den privaten Schlüssel. 

6
Emanuel Miranda

Sie haben Recht, der eingebettete Schlüssel in der App kann leicht von Paketschnüfflern oder verschiedenen anderen Techniken abgerufen werden. Sie können dieses Problem überwinden, indem Sie die folgenden Anweisungen befolgen.

  • client (Ihre App) ruft die erforderliche API auf 
  • server lehnt es ab, sendet jedoch eine Zeichenfolge mit einem zufälligen Hash (= Herausforderung). 
  • client verwendet diese Zeichenfolge in Kombination mit einer anderen Zeichenfolge (= Kennwort) (bereits in der App eingebettet), um einen neuen Hash (= Digest) zu generieren. 
  • der Client ruft dieselbe API erneut auf, verwendet jedoch neu erstellten Digest als Authentifizierungsparameter. 
  • der Server überprüft diesen Digest und fährt fort 

Zu Ihrer Information: Das oben erwähnte Verfahren ist weithin akzeptierter Standard und wird als Digest Authentication bezeichnet. Wenn Sie weitere Hilfe benötigen, fragen Sie Google einfach nach "Android http Digest-Authentifizierung".

4
Nasir Iqbal

Sie können den Job für Reverse-Ingenieure zwar schwieriger machen, aber nicht kugelsicher machen, wie Nasir sagte, indem Sie mathematisch schwierige Probleme einführen und Ihre hart codierte Zeichenkette entsprechend transformieren.

Wie wäre es damit. Angenommen, eine in der App festgelegte Zahl A. Der Server sendet zwei Zahlen B & P (P ist eine große Primzahl). Jetzt können Sie die tatsächliche Anzahl berechnen, die vom Server mit (A^B) % P bestätigt wird. Ihre App verschlüsselt jetzt die Antwort von (A^B)%P mit Server's Public Key. Der Server entschlüsselt ihn mit seinem privaten Schlüssel, validiert ihn und gibt ein Token (möglicherweise jwt) mit Ablaufzeit aus. Dann können Ihre App und Ihr Server mit diesem Token kommunizieren. Sie können die Berechnungen einmal durchführen, wenn die App startet, und das Token für die weitere Verwendung speichern.

1
Javapocalypse

Ich würde vorschlagen, ein komplexes Token in der App zu erstellen, das aus timestamp + appId + einem beliebigen anderen Wert besteht, den Sie auf dem Server replizieren können, und sich im Header jeder Anforderung mit diesen authentifiziert. 

Sie können beispielsweise einen virtuellen "Benutzer" in Ihrer Datenbank erstellen und das gerätetoken darin speichern und für Ihren Algorithmus verwenden. 

Ich persönlich halte eine API-Anfrage öffentlich, nämlich den Zeitstempel-Getter, der den Zeitstempel des Servers innerhalb von 300 Sekunden zur Verwendung zurückgibt. 

holen Sie sich also vor jeder Anforderung den Zeitstempel und senden Sie das erstellte Token, replizieren Sie es auf dem Server und authentifizieren Sie die Anforderung.

Ein mittelmäßiger Hacker kann die App zurückentwickeln und Ihre Token replizieren

0
Ralph Melhem