Xamarin - API Key speichern?

Rote_Orange

Cadet 3rd Year
Registriert
Juni 2018
Beiträge
57
Hallo zusammen,

ich arbeite gerade an einer Xamarin-App und habe ein kleines "Verständnis" Problem, welches ich auch durch Google bisher nicht lösen konnte. Vl. ist ja hier jemand dabei, der mir einen Tipp geben kann.

Konkret geht es darum, dass ich eine App habe, welche mit einer REST-API kommuniziert. In der API gibt es u.a. eine Registrierungsmethode und eine Loginmethode für Anwender. Die API/Der Server verschlüsselt dann das Passwort und speichert es in einer Datenbank ab. Soweit so gut.

Nun zu den Fragen:
1. Ich möchte ja nicht das Benutzerpasswort im Klartext durchs Internet schicken, bevor es verschlüsselt wird. Also hashe ich es schon in der APP. Aber wo speichere ich jetzt den SecurityKey dazu in der App? Beim dekompilieren findet man den ja ruckzuck. Und über die API kann ich den auch nicht anfragen lassen, dann kann ich ihn auch gleich in der App speichern...
2. Eigentlich quasi das gleiche Problem: In der API habe ich zusätzlich zum benötigten Login auch noch einen API-Key eingebaut. Aber wie soll ich auch den in der App speichern?

Android Apps lassen sich ja extrem leicht dekompilieren. Daher möchte ich die App absichern.

Ich muss ehrlich zugeben, dass ich bisher als Entwickler nur in gesicherten Umgebungen, also VPN geschützten oder lokalen Netzwerken usw. zugange war. Das "offen für alle" Szenario ist mir neu. Deswegen verstehe ich auch noch nicht so ganz wie ich das lösen soll.

Vl. findet sich ja jemand, der mich erleuchtet und mir eine Lösung präsentiert oder meine Herangehensweise sachdienlich kritisiert und mich auf die richtige Fährte bringt.

Lg.
Rote_Orange
 
Ich muss gestehen, ich blick nicht ganz durch.
Was willst du denn damit bewerkstelligen?

Wenn es um Authentifizierung geht, musst du i.d.R. mit asymmetischen Schlüsseln arbeiten.
Das alleine reicht jetzt natürlich erstmal nicht, aber dann, wie erwähnt, verstehe ich auch nicht, was du erreichen willst.

Am Rande:
Wenn du das Passwort nicht plaintext verschicken willst, kommuniziere mit deinem Sever ausschließlich per TLS.
Außerdem solltest du Key Derivation Functions nutzen, statt Passwörter einfach nur zu verschlüsseln.
 
Danke für die Antwort. Also nach dem Prinzip "Key Derivation Functions" arbeite ich bereits auf dem Server. Und ja, die Kommunikation erfolgt auch via TLS. Aber zur Sicherheit, wollte ich das Passwort in der App trotzdem schon verschlüsseln, bevor ich es absende. Dann wirds quasi doppelt verschlüsselt. Aber das geht dann wohl nicht sicher auf dem Endgerät. Dann muss TLS vermutlich reichen.

Rest-Apis haben ja häufig einen API-Key als Zusatzsicherung. Den muss man dann immer im Header mitgeben und das hab ich auch in meine API eingebaut. Ich weiß nur nicht, ob es eine Möglichkeit gibt, diesen API-Key sicher in der App zu "verstauen".
 
Du erstellst dir ein starkes asymmetisches Schlüsselpaar.
Den öffentlichen Schlüssel schickst du dem Client, der damit Geheimnisse verschlüsselt und dein Server ist dann der einzige, der diese Geheimnisse mit dem privaten Schlüssel wieder entschlüsseln kann.
Das geht auch On-The-Fly, sodass jede Session seine eigenen Schlüsselpaare hat.

Beim API-Key habe ich jetzt keine praktische Erfahrung, aber das sollte auf ähnliche Weise funktionieren.
Du erstellst ein weiteres, starkes asymmetisches Schlüsselpaar.
Den API-Key verschlüsselst du mit dem öffentlichen Schlüssel und hinterlegst den in deiner APP.
Diesen verschlüsselten Key schickst du dann deinem Server, der entschlüsselt den und schaut nach ob er gültig ist.

Aber keine Garantie auf Richtigkeit!
Da müsste ich (und das rate ich dir auch) mir erst noch Best Practices anlesen.
 
Zuletzt bearbeitet:
  • Gefällt mir
Reaktionen: Rote_Orange
AW4 schrieb:
Den öffentlichen Schlüssel schickst du dem Client, der damit Geheimnisse verschlüsselt und dein Server ist dann der einzige, der diese Geheimnisse mit dem privaten Schlüssel wieder entschlüsseln kann.
Das geht auch On-The-Fly, sodass jede Session seine eigenen Schlüsselpaare hat.
Also exakt das, was TLS bereits macht? :-)
 
Naja, er wollte es ja doppelt haben :p

AW4 schrieb:
Beim API-Key habe ich jetzt keine praktische Erfahrung, aber das sollte auf ähnliche Weise funktionieren.
Du erstellst ein weiteres, starkes asymmetisches Schlüsselpaar.
Den API-Key verschlüsselst du mit dem öffentlichen Schlüssel und hinterlegst den in deiner APP.
Diesen verschlüsselten Key schickst du dann deinem Server, der entschlüsselt den und schaut nach ob er gültig ist.
Das ist nicht wasserdicht!
Da kann auch wieder jeder herkommen und den verschlüsselten API-Key exrtahieren und in seiner eigenen App nutzen!

Ein Stichwort, dass dir bei deiner Sache evtl. weiterhilf ist "OAuth".
 
  • Gefällt mir
Reaktionen: Rote_Orange
Schau dir dazu am besten Mal Openiddict an, das implementiert OpenId Connect und nimmt dir einiges an Arbeit an.

OpenId Connect ist dabei ein Zusatz zu dem oben genannten OAuth, OAuth wird also auch von openiddict abgedeckt.
 
Rote_Orange schrieb:
Die API/Der Server verschlüsselt dann das Passwort und speichert es in einer Datenbank ab.
Passwörter bitte nicht verschlüsseln, sondern hashen inkl salten.
 
Zurück
Oben