# oAuth Key's verstecken/verschlüsseln/speichern



## Sehales (9. Aug 2012)

Hi,
ich habe eine Anwendung die man für die Verwaltung von Geocaches(Geocaching - The Official Global GPS Cache Hunt Site) verwenden kann und wollte nun die Geocaching API verwenden, diese benutzen oAuth für die Authentifizierung, die Frage ist nun um oAuth zu nutzen braucht man ja die Tokens und ich wollte fragen ob jemand weiss wie ich diese am besten speichern kann ohne das jemand mir nichts dir nichts an die Keys rankommen kann der dann mein Programm benutzt. Im Prinzip ist es meines Wissens nicht möglich es zu verhindern das jemand an den Quellcode rankommt und somit auch sieht wie ich zum Beispiel eine Verschlüsselung gestalte, gibt es eventuell eine Möglichkeit eine sqlite Datenbank oder ähnliches zu erstellen die nur auf die Anfragen meines Programmes reagiert in der dann die Sachen abgespeichert werden oder weiss jemand eine andere Idee wie ich das mache. Einen Server hätte ich auch zur Verfügung ich kann aber leider kein PHP programmieren sonst könnte man die Anfragen über den Server leiten. Einzige Möglichkeit währe das mir jemand ein Skript schreibt das ich durch das Programm aufrufe und die Anfragen sozusagen weiterleitet. Ich weiss nicht inwiefern das einfach möglich wäre aber vielleicht erklärt sich ja jemand zu soetwas bereit. Dann kann man die Key's in einer MySQL Datenbank auf dem Server speichern und somit sind sie geschützt.

Mit freundlichen Grüßen
Sehales


----------



## SecurityDev (9. Aug 2012)

Grundsätzlich gilt : Login-Daten haben NICHTS im Client zu suchen. Wenn du dich mit deiner Software also irgendwo bei einem 3rd-party-Dienst anmelden willst dann würde ich dieses Konzept ganz schnell verwerfen. Fordere deinen User auf sich beim Dienst selbst zu registrieren und lass ihn dann über deine App einloggen, so brauchst du dich nicht um deine Keys zu kümmern. Außerdem bist DU verantwortlich wenn jemand mit DEINEN Keys Mist baut. Darum sollte man eigene Zugänge sowieso nie weitergeben.

Ein einfaches Proxy-Script in PHP ist schnell gemacht, würde ich aber trotzdem nicht nutzen da zwar die Login-Daten gesichert und gefiltert sind, aber beim Dienst-Anbieter trotzdem DEINE ID verwendet wird. Außerdem kommt es immer vom selben Server. Und mehrere Anfragen von der selben Quelle mit den selben Login-Daten ... hmmm ? So lange es in den AGB des Dienst-Anbieters nicht untersagt ist kann mans ja machen, ist aber nicht gerade optimal. Außerdem müsstest du dann für den Traffic aufkommen, und das sogar doppelt : die Anfrage geht beim Server ein und du leitest diese weiter, nun kommt die Antwort die du filterst und dann ebenfalls weiterleitest. Bei dir läuft der Zähler also doppelt : in + out. Und ob du dir das auf dauer leisten kannst ?


Wenn du also eine App gebastelt hast die halt Zugriff auf ein Dienst-Angebot hat, dann löse dich davon das deine Kunden dann nur deinen einen Zugang nutzen und richte es so ein das sich jeder selbst registrieren und einloggen muss.

Oder habe ich was von der Funktionsweise von dem was du da machen willst nicht verstanden ?


----------



## Sehales (9. Aug 2012)

Ob du es falsch verstanden hast weiss ich nicht ich denke ich habe das ein bisschen falsch erklärt. Ich bekomme von der Firma Groundspeak die Keys, diese MUSS mein Programm nutzen es kann sich nicht jeder eigene Keys holen und darüber kann ich die API ansteuern der User muss sich auch noch selbst registrieren bzw. über das Programm anmelden auf einer eigens dafür gemachten Seite der Firma, diese gibt mir dann ein Client Key zurück und diesen gebe ich bei den API aufrufen wiederum mit um zu überprüfen welche Rechte dieser User überhaupt hat(Normal, Premium) und das zusätzlich. Die Firma sagt Pack den kram in den Client oder auf den Server, wo die Keys liegen ist denen egal, das einzigste was sie sagen mach es so das es schwierig bis gar nicht geht an die Keys ranzukommen. Daher dachte ich an das wie du es nennst Proxy PHP Script. Im Prinzip sind es ja nur Strings die hin und her geschickt werden, manchmal auch die ein oder andere ZIP Datei als Download, aber diese sind dann auch maximal ein paar MB groß. Mein Server den ich zur Verfügung habe hat 100MB/s UP/DOWN Anbindung und hat einen i7 990 XTREME Hexacore Prozessor und 24 GB ram. Ich weiss nicht in wiefern welche Ressourcen gebraucht werden für die weiterleitung der Daten aber wahrscheinlich größenteils nur die Anbindung und minimal der Prozessor, oder?!? Man kann den Download ja beschränken auf eine bestimmte Geschwindigkeit und falls es zuviele Clients werden was ich erstmal nicht denke, dann kann man bestimmt über die ein oder andere Spende die Serverkosten minimieren und die Anbindung kann man für wenig Geld auf 1 GB/s erhöhen. 
Falls du Lust hast kannst du ja ein Script für die Weiterleitung schreiben, wobei ja einfach nicht gleich wenig heisst. Ich habe eine MySQL Datenbank die nur lokal angesprochen werden kann auf dem Server laufen ich denke darüber liesse sich das am besten machen, also die Keys speichern. Eine andere Idee wäre eine Anfrage an den Server vom Client, anbei schickt er einen MD5 Hashwert generiert aus der größe des Programms und dieser Wert ist wiederrum auf dem Server hinterlegt, der Server überprüft dies und gibt dann die Keys an den Client weiter. Ich weiss aber nicht inwiefern man es dann aus dem Arbeitspeicher auslesen kann, ich denke mal das wäre zu unsicher oder?
Ich bin für jede Idee offen, falls du oder jemand anderes mir da weiterhelfen möchte wäre das echt nett.

Mit freundlichen Grüßen
Sehales


----------



## SecurityDev (10. Aug 2012)

Ja doch, ich denke jetzt hab ich so halbwegs verstanden was du machen willst.

Ich würde dir für diese Aufgabe auf jeden Fall empfehlen den Datenverkehr über einen gesicherten Server (wenn möglich SSL) laufen zu lassen und dort die Keys zu speichern. Dadurch ist ausgeschlossen das der Client an irgendwelche sensiblen Daten kommt.

Das PHP-Script würde ich dann in etwa so auslegen das folgende Arbeitsweise zustande kommt :

1) Anfrage vom Client an das Script
2) Script wertet Anfrage aus und setzt nötige Daten wie Keys ein
3) Script schickt nun komplette Anfrage an den Server
4) nach erhalt der Antwort vom Server werden durch das Script alle sensiblen Daten die NICHT für den Client sind wieder rausgefiltert (eventuell müssen dann Checksummen neu berechnet werden)
5) Script gibt gefilterte Antwort an Client

Direkt werd ich dir da leider nicht helfen können. Ich hab zwar PHP recht gut drauf (nach langer Zeit auch sogar OOP-PHP) und könnte sowas umsetzen, allerdings kenne ich mich weder mit der API aus noch habe ich Zugang zu den nötigen Daten zum Testen. Es sollte sich doch jemand in deinem näheren Umfeld finden lassen der PHP soweit drauf hat um das umzusetzen.

Von einer "normalen" Proxy-Software würde ich dir allerdings eher abraten. Es ist zwar richtig das man in einigen sehr komplexe Filter-Regeln definieren kann, jedoch würde dann der Server selbst zum "public Proxy" da man sicher irgendwo ein Schlupfloch in den Regeln finden würde.


----------



## Sehales (11. Aug 2012)

Danke erstmal soweit. Ich selber bin da genauso schlau wie du da ich bisher noch nicht viel mit der API gemacht habe Test Keys könnte ich dir geben und im Gegensatz zu Java gibt es offizielle Beispiele zur API in PHP. In meinem näheren Umfeld findet sich seit einem halben Jahr keiner der dazu fähig ist sonst hätte ich hier gr nicht erst etwas geschrieben. Wäre gut (falls du es willst)wenn du dir vllt mal einen Account machen würdest und ich dir die benötigten Daten geben kann(das geht natürlich auch per email oder eventuell auch skype). Daran würde es nicht scheitern, ob du es dann für mich machen würdest wäre wohl die größere Frage. Ich denke zum Beispiel Geld liesse sich damit bestimmt auh verdienen über vllt eine lite und Pro Version oder sicherlich auch Paypal Spenden daran würde ich dich dann natürlich beteiligen. Bis ich mit dem Programm soweit bin wird wahracheinlich noch ca ein viertel bis halbes Jahr vergehen aber je früher die Tests und die Anbindung mit und an der API beginnen desto besser. Bezüglich der Tests kann ich auf einem der Server auch einen vServer anlegen und die Daten zum verwenden der API liessen sich auch vertraut behandelt weitergeben, nur halt nicht hier im Thread.


----------



## gasssst (11. Aug 2012)

Sehales hat gesagt.:


> diese benutzen oAuth für die Authentifizierung, die Frage ist nun um oAuth zu nutzen braucht man ja die Tokens und ich wollte fragen ob jemand weiss wie ich diese am besten speichern kann ohne das jemand mir nichts dir nichts an die Keys rankommen kann der dann mein Programm benutzt.


Der Satz selbst macht keinen Sinn; geht es um den consumer key den du zu verstecken versuchst? Wenn ja wüsste ich nicht welchen Vorteil dir ein PHP Service bringen sollte, außer dass du eine weitere, noch ungeschütztere Schicht in den ganzen Prozess einbaust, und natürlich alle userdaten mitscheiden kannst  :toll:


----------



## Sehales (11. Aug 2012)

nein es geht um den secret Key und das Access Token. Das bekommt man ja wiederrum aus Consumer Key und Secret Key. Userdaten werden wiederrum vom Client verarbeitet und nicht von der PHP Seite bzw dem script. Warum sollte ich damit unnötig den Server belasten und es nicht einfach im Client zwischenspeichern. Die Login Infos von einem selber wird wohl niemand versuchen rauszufiltern


----------

