web-dev-qa-db-ger.com

Wie speichere ich einen geheimen API-Schlüssel in der Binärdatei einer Anwendung?

Ich erstelle einen Twitter-Client für Mac OS X und habe ein Consumer-Geheimnis. Soweit ich weiß, sollte ich diesen geheimen Schlüssel nicht weitergeben. Das Problem ist, dass, wenn ich es als String-Literal in meine Anwendung setze und es wie folgt verwende:

#define QQTwitterConsumerSecret @"MYSECRETYOUMAYNOTKNOW"

[[QQTwitterEngine alloc] initWithConsumerKey:QQTwitterConsumerKey consumerSecret:QQTwitterConsumerSecret];

Es befindet sich im Datenbereich der Binärdatei meiner Anwendung. Hacker können dies lesen, die Anwendung zerlegen usw.

Gibt es eine sichere Möglichkeit, das Verbrauchergeheimnis zu speichern? Soll ich es verschlüsseln?

40
user142019

Es gibt keine wirklich perfekte Lösung. Egal, was Sie tun, jemand, der sich dafür engagiert, kann es stehlen.

Sogar Twitter für iPhone/iPad/Android/Mac/etc. hat einen geheimen Schlüssel drin, sie haben ihn wahrscheinlich irgendwie verdunkelt.

Sie könnten es beispielsweise in verschiedene Dateien oder Strings usw. aufteilen.

Hinweis: Mit einem Hex-Editor können Sie ASCII-Zeichenfolgen in einer Binärdatei lesen. Dies ist der einfachste Weg. Wenn Sie den geheimen Schlüssel in verschiedene Teile aufteilen oder Funktionsaufrufe verwenden, um den geheimen Schlüssel zu erstellen, wird dieser Prozess normalerweise schwieriger.

26

Sie können es einfach base64-encodieren, um es zu verschleiern. Oder, bessere Idee, generiere den Schlüssel, anstatt ihn nur zu speichern - schreibe so etwas:

char key[100];
++key[0]; ... ; ++key[0]; // increment as many times as necessary to get the ascii code of the first character
// ... and so on, you get the idea.

Ein wirklich guter Hacker wird es jedoch auf jeden Fall finden; Die einzige Möglichkeit, es wirklich vor den Augen anderer zu schützen, besteht in der Verwendung einer sicheren Hash-Funktion, die Sie dann jedoch auch nicht abrufen können :)

7
user500944

Sie sollten keinen geheimen API-Schlüssel in einer Anwendung verwenden, die nicht ausschließlich auf Ihrem Server ausgeführt wird.

Auch wenn es perfekt versteckt ist .. Sie können immer die Daten abhören, die durch die Leitung gehen. Und da es sich um Ihr Gerät handelt, können Sie sogar SSL manipulieren (in der Mitte ein Zertifikat, das von einer benutzerdefinierten Zertifizierungsstelle erstellt wurde, die der Liste der vertrauenswürdigen Zertifizierungsstellen des Geräts hinzugefügt wurde). Oder Sie können sich in die SSL-Bibliothek einhängen, um die Daten abzufangen, bevor sie tatsächlich verschlüsselt werden.

2
ThiefMaster

Eine wirklich späte Antwort ...

Wenn Sie Ihren eigenen Server einrichten, können Sie ihn dabei unterstützen, dass Ihre Desktop-App von Benutzern bei Twitter autorisiert wird, ohne Ihren geheimen Schlüssel zu teilen (d. H.: Einbetten). 

Sie können diesen Ansatz verwenden:

Wenn ein Benutzer Ihre Desktop-App installiert, muss er sie bei Twitter und bei Ihrem Server registrieren. *) *) Die App fordert den Server auf, die Token-Anforderungs-URL *) Zu generieren Server sendet die generierte URL an die App *) Die App leitet den Benutzer an die Autorisierungs-URL *). Der Benutzer autorisiert Ihre App bei Twitter und fügt die generierte PIN in ein it *) Mit der PIN greift die App nach dem Token *). Für die weitere Kommunikation wird das Token verwendet und der Server ist nicht beteiligt

Hinweis: Die App meldet sich mit den Benutzeranmeldeinformationen (z. B. ID und Kennwort) für Ihren Server an Ihrem Server an.

0
hawk78