In iOS, wie kann ich speichern eines geheimen "Schlüssel", mit denen ich die Kommunikation mit meinem server?
Ich speichern wollen, einen geheimen Schlüssel ("abc123"), die ich benutze in der Kopfzeile meines REST-API-Anfragen. Mein server prüft diesen geheimen Schlüssel. Wenn Sie mit "abc123", dann kann der Antrag gestellt werden.
Ich denke über eine einfache Lösung, wie:
let secret = "abc123"
Aber gibt es irgendwelche Nachteile zu diesem?
- stackoverflow.com/a/40423579/3141234
- Sie habe das Wort geheimen Schlüssel, aber wenn Sie, wie in der überschrift, dann das, was du meinst, ist eigentlich
api-key
nichtsecret-key
. Bearbeiten können Sie Ihre Frage?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Verrückt wie es klingt, ist dies wahrscheinlich die beste Lösung. Alles andere ist komplizierter, aber nicht viel sicherer. Jede Phantasie obfuscation-Techniken, die Sie verwenden sind nur reverse engineered fast so schnell, wie Sie finden diese Taste. Aber diese statische key-Lösung, während Wild sich unsicher, ist fast ebenso sicher als die anderen Lösungen, während imposante fast keine zusätzliche Komplexität. Ich Liebe es.
Es gebrochen werden fast sofort, aber so werden alle anderen Lösungen. So halten Sie es einfach.
Das einzige, was Sie wirklich wollen, um hier tun, ist die Verwendung von HTTPS und pin Ihrer Zertifikate. Und ich würde suchen einem langen, zufälligen Schlüssel, der nicht ein Wort. Idealerweise sollte es sich um eine vollständig zufällige Zeichenfolge von bytes, gespeichert als raw-Werte (nicht-Zeichen), so dass es hebt sich nicht so offensichtlich in Ihre binäre. Wenn Sie möchten, um verrückt sind, gelten ein SHA256, um es vor dem senden (also der eigentliche Schlüssel nie zeigt sich in Ihrer Binär). Auch dies ist wieder trivial zu brechen, aber es ist einfach, und wird nicht verschwenden viel Zeit in die Entwicklung.
Ist es unwahrscheinlich, dass jede Anstrengung, die länger als eine Stunde wird der Mühe Wert sein, um diese Funktion zu implementieren. Wenn Sie wollen, dass viel mehr zum Thema finden Sie Sichere https-Verschlüsselung für das iPhone app zur Webseite und seiner links.
Data
, aber ja, die[UInt8]
erreicht das gleiche. Der Punkt ist nicht, um Sie in Base64 oder sowas. Stellen Sie sicher, es ist "nur bytes" und nicht etwas, das in UTF-8 kodiert.Durch hardcoding dem string in Ihre app, ist es möglich für einen Angreifer zu entschlüsseln, Ihre binäre (über Extras wie dumpdecrypt) und erhalten Sie Ihre Zeichenkette ohne viel Mühe (ein einfacher hexdump gehören würden alle Zeichenfolgen, die in Ihrer app).
Es gibt ein paar Problemumgehungen für diese. Könnte man implementieren, die einen Endpunkt auf Ihre REST-API gibt, die Ihre Anmeldeinformationen ein, Sie könnten rufen Sie dann auf starten. Natürlich, dies hat seine eigene nicht-triviale Sicherheit betrifft, und erfordert einen zusätzlichen HTTP-Aufruf. Ich in der Regel würde nicht tun es auf diese Weise.
Weitere Möglichkeit ist die Verschleierung der geheime Schlüssel irgendwie. Dadurch, dass die Angreifer nicht in der Lage, sofort erkennen, Ihre Schlüssel nach der Entschlüsselung. cocoapods-Tasten ist eine option, die diese Methode verwendet.
Es gibt keine perfekte Lösung – das beste, was Sie tun können, ist es so schwer wie möglich für einen Angreifer Holen Sie sich ein halten Sie Ihre Schlüssel.
(Auch, achten Sie darauf, HTTPS zu verwenden, wenn das senden von Anfragen, ansonsten ist ein weiterer guter Weg, um Kompromisse Ihre Schlüssel.)
By hardcoding the string in your app, it's possible for attackers to decrypt your binary
Dies konnte nur geschehen auf einem gerooteten ios-Gerät?Während in-band-Token werden Häufig verwendet, für manche Programme, die du wahrscheinlich irgendwann auch zur Umsetzung von TLS zum Schutz der Netzwerk-traffic und die Token. Diese als Rob Napier erwähnt in einer anderen Antwort.
Mit Ihrem eigenen Zertifikat-Kette hier ermöglicht die Verwendung von bestehenden TLS-Sicherheit und Authentifizierung-Mechanismen und die iOS keychain, und gibt Ihnen auch die Möglichkeit der Widerrufung TLS-Anmeldeinformationen, wenn (Wann?) , die notwendig wird, und auch ermöglicht es dem client, um seine pin-verbindungen zu Ihren Servern zu erkennen und server-spoofing werden, wenn erforderlich.
Ihre eigene Zertifizierungsstelle und Ihre eigenen certificate chain ist kostenlos, und Ihre eigenen Zertifikate sind — wenn man erst mal das root-Zertifikat in den client geladen — sind nur so sicher wie kommerziell-gekaufte Zertifikate.
Kurz gesagt, dieses Zertifikat-basierter Ansatz kombiniert die Verschlüsselung und Authentifizierung, die mit der bestehenden TLS-Mechanismen.
Sieht es aus wie Sie mit access-Token. Ich würde Schlüsselbund für den Zugang Token. Für Client-IDs, ich würde halten Sie einfach nur als variable, da client-ids nicht ändern, während access tokens ändern pro Benutzer oder auch pro refresh token und der Schlüsselbund einen sicheren Platz für die Speicherung von Anmeldeinformationen.
Habe ich die PFConfig-Objekt (dictionary), das ermöglicht das abrufen Ihrer app Werte von Variablen gespeichert, die Server-Umgebung Parameter.
Ähnlich wie die Umwelt-Variablen, die abgefragt werden können, indem Sie ENV in Webseiten, serverseitige Programmierung wie Ruby oder PHP.
Meiner Meinung nach ist das ungefähr so sicher wie die Verwendung von Environment-Variablen in Ruby oder ähnliches.
Wenn Sie es speichern möchten, und wenn jemand die Gemüter mit Ihrer app, kann er/Sie den Zugang zu Ihrem geheimen Schlüssel. Ich würde empfehlen, für Sie zu starten, speichern Sie Ihre geheimen entweder als #define oder Benutzer standardmäßig für jetzt (so können Sie Ihre app erstellt zuerst), und einmal sind Sie in der Nähe app-übermittlung, Nutzung Schlüsselanhänger Hier ist ein Beispiel Antwort
#define
in Swift und Objective-C, am Ende des Tages mit#define
ist nicht besser als einNSString
konstant.#define
in beiden Sprachen (wenn er existierte in Swift), und es führt nicht zu der Mühe, die#define
manchmal führen kann.