web-dev-qa-db-ger.com

clientgeheimnis in OAuth 2.0

Um Google Drive-API zu verwenden, muss ich mit der Authentifizierung mit OAuth2.0 spielen. Und ich habe dazu ein paar Fragen.

  1. Kunden-ID und Kundengeheimnis werden verwendet, um festzustellen, was meine App ist. Sie müssen jedoch fest codiert sein, wenn es sich um eine Clientanwendung handelt. So kann jeder meine App dekompilieren und aus dem Quellcode extrahieren. Bedeutet das, dass eine schlechte App sich als gute App ausgeben kann, indem sie die Client-ID und das Geheimnis der guten App verwendet? Der Benutzer würde also einen Bildschirm anzeigen, in dem er um Erlaubnis für eine gute App gefragt wird, obwohl er tatsächlich von einer schlechten App gefragt wird? Wenn ja, was soll ich tun? Oder sollte ich mir eigentlich keine Sorgen machen?

  2. In der mobilen Anwendung können wir einen Webview in unsere App einbetten. Es ist einfach, das Kennwortfeld im Webview zu extrahieren, da die app, die um Erlaubnis fragt, tatsächlich ein "Browser" ist. OAuth in der mobilen Anwendung hat also nicht den Vorteil, dass die Clientanwendung keinen Zugriff auf die Anmeldeinformationen des Diensteanbieters hat?  

85
Bear

Ich habe angefangen, einen Kommentar zu Ihrer Frage zu schreiben, aber dann habe ich herausgefunden, dass es zu viel zu sagen gibt. Hier sind meine Ansichten zu diesem Thema in der Antwort.

  1. Ja, dafür gibt es eine reale Möglichkeit und es wurden einige Exploits daraus abgeleitet. Es wird empfohlen, die App nicht in Ihrer App geheim zu halten. Es gibt sogar einen Teil der Spezifikation, dass verteilte Apps dieses Token nicht verwenden sollten. Jetzt fragen Sie vielleicht, aber XYZ benötigt es, um funktionieren zu können. In diesem Fall implementieren sie die Spezifikation nicht ordnungsgemäß, und Sie sollten A diesen Dienst nicht verwenden (unwahrscheinlich) oder B versuchen, das Token mithilfe verschleierter Methoden zu sichern, um das Auffinden oder Verwenden Ihres Servers als Proxy zu erschweren.

    Zum Beispiel gab es einige Fehler in der Facebook-Bibliothek für Android, bei denen Token an Logs verloren gingen. Weitere Informationen hierzu finden Sie hier http://attack-secure.com/all-your-facebook-access- token-sind-gehören-zu-uns und hier https://www.youtube.com/watch?v=twyL7Uxe6sk . Alles in allem sollten Sie bei der Verwendung von Drittanbietern besonders vorsichtig sein Parteibibliotheken (der gesunde Menschenverstand, aber wenn Token-Hijacking Ihre größte Sorge ist, fügen Sie vorsichtig etwas hinzu).

  2. Ich habe seit geraumer Zeit über den Punkt 2 geredet. Ich habe sogar einige Problemumgehungen in meinen Apps vorgenommen, um die Zustimmungsseiten zu ändern (z. B. durch Ändern des Zooms und des Designs, um zur App zu passen), aber nichts hinderte mich daran, Werte aus Feldern in der Webansicht mit Benutzername und Kennwort zu lesen. Deshalb stimme ich mit Ihrem zweiten Punkt vollkommen überein und finde es in OAuth spec. Punkt "App erhält keinen Zugriff auf Benutzeranmeldeinformationen" in der Spezifikation ist nur ein Traum und gibt den Benutzern ein falsches Gefühl der Sicherheit ... Außerdem vermute ich, dass die Leute normalerweise misstrauisch sind, wenn sie von Facebook nach Facebook, Twitter, Dropbox oder anderen Anmeldeinformationen gefragt werden. Ich bezweifle, dass viele gewöhnliche Leute die OAuth-Spezifikation lesen und sagen "Jetzt bin ich in Sicherheit", aber stattdessen den gesunden Menschenverstand und keine Apps, denen sie nicht trauen.

14
PSIXO

Ich hatte die gleiche Frage wie die Frage 1 und habe in letzter Zeit selbst recherchiert, und meine Schlussfolgerung ist, dass es in Ordnung ist, "client secret" nicht geheim zu halten. Die Art von Kunden, die die Vertraulichkeit des Kunden nicht wahren secret wird in der OAuth2-Spezifikation als "öffentlicher Client" bezeichnet. Die Möglichkeit, dass ein Angreifer Autorisierungscode und dann Zugriffstoken erhält, wird durch die folgenden Tatsachen verhindert.

1. Der Kunde muss den Autorisierungscode direkt vom Benutzer und nicht vom Dienst erhalten

Selbst wenn der Benutzer den Dienst angibt, dem er dem Client vertraut, kann der Client den Autorisierungscode nicht einfach durch Angabe der Client-ID und des Client-Geheimnisses abrufen. Er muss den Autorisierungscode direkt vom Benutzer abrufen. (Dies geschieht normalerweise durch eine URL-Umleitung, über die ich später noch sprechen werde.) Für den böswilligen Client reicht es daher nicht aus, die vom Benutzer vertraute Client-ID/das geheime Geheimnis zu kennen. Es muss den Benutzer irgendwie involvieren oder fälschen, um ihm den Autorisierungscode zu geben Dies sollte schwieriger sein, als nur die Client-ID/das Geheimnis zu kennen.

2. Die Weiterleitungs-URL ist mit der Client-ID/geheim registriert

Nehmen wir an, der bösartige Client hat es irgendwie geschafft, den Benutzer einzubeziehen und ihn/sie auf der Serviceseite auf die Schaltfläche "Authorize this app" klicken. Dadurch wird die URL-Umleitungsantwort vom Dienst an den Browser des Benutzers mit dem Autorisierungscode mit ausgelöst it . Dann wird der Autorisierungscode vom Browser des Benutzers an die Weiterleitungs-URL gesendet, und der Client soll die Weiterleitungs-URL abhören, um den Autorisierungscode zu erhalten . (Die Weiterleitungs-URL kann auch localhost sein. und ich dachte mir, dass dies ein typischer Weg ist, auf dem ein "öffentlicher Client" einen Autorisierungscode erhält.) Da diese Weiterleitungs-URL beim Dienst mit der Client-ID/secret registriert ist, kann der böswillige Client nicht steuern, wo er sich befindet Der Autorisierungscode wird an ..__ übergeben. Dies bedeutet, dass der böswillige Client mit Ihrer Client-ID/Ihrem Geheimnis ein weiteres Hindernis für den Erhalt des Autorisierungscodes des Benutzers aufweist.

9
hideaki

Beantwortung der zweiten Frage: Google-APIs verlangen aus Sicherheitsgründen, dass die Authentifizierung/Anmeldung nicht innerhalb der App selbst durchgeführt werden kann (Webviews sind nicht zulässig). Sie müssen außerhalb der App mithilfe von Browser ausgeführt werden, um die Sicherheit zu verbessern. Dies wird weiter unten erläutert. . https://developers.googleblog.com/2016/08/modernizing-oauth-interactions-in-native-apps.html

0
v.j