Der beste Weg, um den API-Schlüssel im Quellcode zu verstecken


12

Ich benötige einige Ideen zum Schutz eines privaten API-Schlüssels in einer Anwendung, insbesondere in einer ac # .NET-Anwendung.

Erstens verstehe ich, dass es theoretisch unmöglich ist, irgendetwas im Quellcode zu verbergen, also bin ich auf eine andere Idee gekommen, aber ich bin nicht sicher, wie plausibel es ist. Wie auch immer, wäre es möglich, irgendwie mit einem Webserver zu kommunizieren, um den privaten Schlüssel zu überprüfen und dann mit der Anwendung zu sprechen, um zu bestätigen, dass es sich um einen legitimen Handshake handelt?

Ich muss mit zwei Schlüsseln arbeiten: einem öffentlichen Schlüssel (wie der Name schon sagt, muss er nicht mit der gleichen Sorgfalt behandelt werden wie der private) und einem privaten Schlüssel, der vor anderen geschützt werden muss.

Über Ideen, wie ich das machen könnte, würde ich mich sehr freuen.


4
Versuchen Sie zu verhindern, dass jemand, der Zugriff auf eine implementierte Binäranwendung hat, den Schlüssel liest (wie aus Ihrem Titel hervorgeht), oder schützen Sie ihn davor, ihn zu ändern (wie aus Ihrer Idee, über den Server zu überprüfen, hervorgeht)? Was ist das ultimative Endziel?
Gregmac

3
Es kann nützlich sein, das Konzept eines API-Schlüssels für Leser zu skizzieren, die mit diesem nicht vertraut sind. Ein API-Schlüssel ist ein Geheimnis, das dem Entwickler einer Software zugesprochen wird, die mit einem Dienst (normalerweise einem Webdienst) interagiert. Es wird verwendet, um die Quelle des Datenverkehrs zu identifizieren, Einschränkungen gegenüber anonymen Zugriffen aufzuheben und dem Besitzer des Schlüssels die Servicenutzung in Rechnung zu stellen. Es wird erwartet, dass Sie es mäßig versteckt halten und es vorzugsweise widerrufen, wenn es kompromittiert wird. Da es in vollem Umfang an den Dienst kommuniziert werden muss, verlieren Sie immer.
Lars Viklund

@gregmac Ja, ich versuche zu verhindern, dass Drittbenutzer der Anwendung den Schlüssel lesen.
Spencer

Antworten:


12

Zusammenfassen:

  • Sie haben einen API-Schlüssel, der Ihnen von einem Anbieter ausgestellt wurde, damit Sie dessen API verwenden können, und Sie sind verpflichtet, zu verhindern, dass dieser Schlüssel anderen bekannt wird
  • Sie rufen die API dieses Anbieters (für die der API-Schlüssel erforderlich ist) in Ihrem Anwendungscode auf
  • Sie stellen die Anwendung auf Systemen bereit, auf denen Kunden Zugriff auf die Binärdateien haben und somit möglicherweise den Code dekompilieren / deobfuscieren oder den Datenverkehr abfangen können

Der beste Weg, um eine Gefährdung dieses Schlüssels zu verhindern, besteht darin, die Kontrolle darüber zu behalten. Dies bedeutet, dass es niemals auf einem Server bereitgestellt werden sollte, auf dem jemand außer Ihnen die Binärdatei lesen konnte, und niemals über eine Kommunikationsverbindung gehen sollte, die Sie nicht kontrollieren.

Wenn die Binärdateien außerhalb Ihrer Kontrolle liegen, liegt letztendlich alles in ihnen außerhalb Ihrer Kontrolle. Wenn jemand Datenverkehr abfangen kann, kann er den API-Schlüssel erfassen ( möglicherweise auch, wenn Sie SSL verwenden ).

Ich sehe zwei Hauptmethoden, um dies zu erreichen. Beide enthalten Ihren privaten API-Schlüssel nicht in Ihrer bereitgestellten Anwendung:

Erhalten Sie einen eindeutigen API-Schlüssel für jede Bereitstellung

Dies würde eine zusätzliche Beziehung zum Anbieter erfordern, in der Sie Schlüssel erhalten oder Ihre Kunden Schlüssel erhalten können.

Dies ist beispielsweise bei Produkten, die die Google Maps-API verwenden, häufig der Fall. Der Ersteller der Software verfügt über einen eigenen Schlüssel, den er beim Entwickeln / Ausführen seiner Kopie verwendet, der jedoch nicht in der Software enthalten ist. Stattdessen müssen Sie als Nutzer, der diese Software installiert, zu Google gehen und Ihre eigene API anfordern Schlüssel. Die Software verfügt lediglich über eine Konfigurationsoption zum Festlegen des zu verwendenden Google Maps-API-Schlüssels.

Bei vielen Anbietern, die vertraglich API-Schlüssel ausstellen, müssen Sie diese Schritte ausführen, sodass Sie möglicherweise ohnehin auf dem falschen Weg sind. Dies ist möglicherweise die einzige Lösung, die Sie gemäß den Nutzungsbedingungen des Anbieters und verwenden dürfen / oder irgendwelche rechtlichen Verträge, die Sie möglicherweise mit ihnen haben.

Verwenden Sie einen Proxy

Richten Sie eine Proxy-API ein, bei der Ihre Anwendung Ihre API (auf Ihren Servern) aufruft und Ihre API wiederum die API des Anbieters mithilfe des Schlüssels aufruft.

Möglicherweise benötigen Sie zusätzlichen Schutz für Ihre API, z. B. um sicherzustellen, dass nur Ihre Anwendung diese verwendet. Dies könnte geschehen durch:

  • Wenn Sie die Funktionalität so spezifisch gestalten, kann sie nur Ihre App verwenden
  • IP-Whitelists
  • Einige vorhandene Lizenzierungs- / Autorisierungsmechanismen, die Sie bereits für Ihre Server haben
  • Ihr eigenes API-Schlüsselsystem, in dem Sie Ihren Kunden Schlüssel ausstellen können

Beachten Sie hierbei, dass Sie dies möglicherweise nicht tun dürfen. Ihr Anbieter verfügt möglicherweise über Nutzungsbedingungen oder gesetzliche Verträge, die Sie daran hindern, einen "Aggregationsservice" oder einen Proxy zu erstellen. Sie müssen dies daher überprüfen.


Umgang mit Fehlverhalten

Selbst wenn Ihr Schlüssel nicht kompromittiert wird und einer Ihrer Kunden etwas unternimmt, das den Anbieter veranlasst, Ihren Schlüssel zu blockieren, werden plötzlich ALLE Ihre Kunden deaktiviert, und Sie müssen nur alle anderen aktualisieren.

Wenn Sie einen Ihrer Kunden blockieren möchten (z. B. wenn er nicht mehr bezahlt, die Software raubkopiert hat usw.), können Sie dies nicht tun, ohne ein Update für alle anderen auszugeben und dann den Schlüssel zu deaktivieren.

Die Logistik für alles, was über eine Handvoll Kunden hinausgeht, wird schnell unhaltbar.

Unabhängig davon, ob Sie als Proxy fungieren oder über einen eindeutigen Schlüssel für jede Installation verfügen, können Sie mit jeder dieser Situationen relativ einfach umgehen (und dies hat für andere kaum oder gar keine Auswirkungen).


Der Versuch, den Schlüssel zu schützen, während er in Ihre Software eingebettet ist, ist letztendlich eine vergebliche Anstrengung. Unabhängig davon, was Sie tun, kann jeder Angreifer, der Zugriff auf die Binärdateien, die Quelle und / oder den Kommunikationskanal hat und fest genug ist, um auf den Schlüssel zuzugreifen, dies tun.

Also nicht einbetten. "Der einzige Gewinnzug ist, nicht zu spielen."


2
+1 für "Für jede Bereitstellung einen eindeutigen API-Schlüssel abrufen." Könnte sogar in Verbindung mit dem Proxy verwendet werden, wodurch Sie die [eingeschränkte] Möglichkeit haben, ungezogene Schlüssel / Clients zu deaktivieren.
Svidgen

@svidgen Sehr guter Punkt, ich habe einen Abschnitt hinzugefügt, der das bespricht. Vielen Dank.
Gregmac

+1, ein Universalschlüssel wird Sie fast immer im *** beißen
Wyatt Barnett

Sehr tiefgreifende Reaktion. Leider ist mir nur ein privater API-Schlüssel zugewiesen, so dass es nicht möglich ist, den Benutzer zum Abrufen eines Schlüssels aufzufordern, da ich unter NDA mit den Netzwerkprotokollen arbeite und somit der Grund für einen privaten Schlüssel ist. Der Proxy kommt wohl auch nicht in Frage. Möglicherweise muss ich nur irgendwie darauf zurückgreifen, es in ein nicht von Menschen lesbares Format umzuwandeln und es irgendwo im Quellcode abzulegen - keine großartige Option, aber es bleiben nicht viele Optionen übrig.
Spencer

4

Wenn Sie einen Schlüssel im Objektcode haben, ist dieser per Definition öffentlich. Es gibt Hacks um Obfuscatoren, die Objektcode schnell dekompilieren. Ein privater Schlüssel würde sich außerhalb des Objektcodes und in einer anderen Datei befinden. Der schwierige Teil ist, dem Benutzer diesen privaten Schlüssel zur Verfügung zu stellen. Nach der Bereitstellung können Sie eine Signatur des privaten Schlüssels, die am Ende der Datei angeheftet ist, und einen öffentlichen Schlüssel in der Anwendung verwenden, um die Integrität des privaten Schlüssels zu überprüfen. Ein Webserver kann diese Überprüfung auch durchführen, wenn Sie über einen sicheren Kommunikationskanal verfügen.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.