Ich habe ein Projekt, bei dem einige Daten von AES verschlüsselt werden müssen. Allerdings programmiere ich den AES-Schlüssel in meinem Projekt wie folgt:
%Vor%Wenn jemand meine Binärdatei hacken möchte, um den AES-Schlüssel zu finden, den ich fest codiert habe, könnte das einfach sein? Wenn ja, wie kann man den AES-Schlüssel besser speichern?
BEARBEITEN: Der Schlüssel wird verwendet, um einen Datenblock zu verschlüsseln und zu entschlüsseln. Die App lädt die Daten vom Server herunter und verschlüsselt sie dann per App und speichert die verschlüsselten Daten auf dem Datenträger. Dieser Schlüssel wird pro Gerät verwendet, dh jedes Gerät kann einen eigenen Schlüssel haben, solange jedes Mal, wenn die Anwendung ausgeführt wird, der Schlüssel generiert werden kann.
EDIT2: Die Prozedur zum Herunterladen von Daten ist auf diese Weise geschützt: Der Client generiert bei jeder Anmeldung ein zufälliges privates / öffentliches Schlüsselpaar. Er sendet den öffentlichen Schlüssel an den Server, und der Server verwendet den öffentlichen Schlüssel, um einen AES-Schlüssel zu verschlüsseln, und sendet dann einen verschlüsselten AES-Schlüssel an den Client. Client entschlüsselt den AES-Schlüssel und speichert ihn. Client- und Servertransportdaten werden dann mit diesem AES-Schlüssel verschlüsselt.
Ich beabsichtige, die Daten auf der Festplatte nicht durch Hacker entschlüsselt zu schützen. Ich nehme an, dass Hacker mein Binärbild und Daten auf der Festplatte bekommen können. Auch Hacker können meine App auf seinem eigenen Gerät ausführen und Speicher analysieren.
Ich muss diese Art von Angriff nicht schützen: Der Hacker ist so schlau, dass er einen Virus geschrieben hat, der auf jailbroken Geräten läuft, und der Virus kann den laufenden Speicher meiner App analysieren, um nach einem Schlüssel im Speicher zu suchen. Daher müssen wir uns keine Gedanken über die Sicherheit des Netzwerktransports machen.
Ja, es wird wahrscheinlich ziemlich einfach zu finden sein. In der Tat ist es unmöglich, einen Schlüssel lokal so zu speichern, dass er absolut sicher ist. Das Beste, was Sie tun können, ist zu verschleiern und es ist nicht die Mühe wert für den potenziellen Angreifer. Speichern Sie beispielsweise das Passwort in einer Datei mit einer Reihe von Junk-Buchstaben und wählen Sie die richtigen aus. Sagen Sie das Passwort ist "Passwort":
efgwhi p buobgweu a egeihip s s hipwgie hp < b> o neifgwnp r ipndpa d (Ich habe noch keine umfangreichen Nachforschungen angestellt, aber ich denke, dass Blowfish ein ähnliches verwendet Technik auf einem Speicherpuffer)
Sie könnten eine große Zeichenfolge wie diese speichern, wie Sie wollen (eine obskure Codierung würde besser funktionieren), und dann wählen Sie einfach die gewünschten Bits aus. Das einzige Problem, das ich sehen kann, ist, dass Sie es an einem Punkt im Speicher ablegen müssen, und wenn es im Speicher ist, dann kann eine bestimmte Person es mit GDB oder LLDB bekommen, soweit ich weiß. Um dies störender zu gestalten, sollten Sie das Passwort nicht als NSString
speichern (versuchen Sie, bei NSData
zu bleiben). Es müsste sich aber wirklich gelohnt haben. Am Ende sind Ihre Daten leider nie auf einem iOS-Gerät sicher.
Das beste Szenario ist, dass sich diese Datei auf einem Server befindet. Sie laden die Datei herunter, machen Ihre Magie darauf, speichern das Passwort im Schlüsselbund und löschen die Datei. Verwenden Sie ab diesem Zeitpunkt den Keychain-Wert.
Nur damit Sie wissen, ich bin kein Sicherheitsexperte, das ist nur der erste Gedanke, der mir in den Sinn kam.
BEARBEITEN Ich arbeitete unter der Annahme, dass Sie vorverschlüsselte Daten hatten. Wenn Ihre App die Daten vom Server verschlüsselt, was hindert den Angreifer daran, die Daten einfach vom Server herunterzuladen? Nun, vorausgesetzt, dass Sie ein System dafür haben, könnten Sie einen Schlüssel generieren, wie einige der anderen Antworten sagen, und ihn dann in verschleierter Form im Schlüsselbund speichern. Auf diese Weise wissen die Angreifer selbst dann nicht, was sie tun sollen, wenn sie von einem Angreifer erfasst werden.
Dort als eine Zeichenfolge gespeichert, und ohne jeden anderen Schutz wäre es trivial , den Schlüssel in Ihrer Binärdatei zu finden. Alles, was jemand braucht, ist ein symbolischer Debugger und / oder eine anständige Idee davon, wie ein Schlüssel ungefähr aussehen sollte (wie groß er sein sollte und wie viele gültige Werte sein sollten).
iOS hat anscheinend einige Sicherheitsfunktionen eingebaut, in denen Sie sensible Daten außerhalb der Reichweite von bösartigen Apps speichern können. Problem ist, ein Großteil davon scheint davon auszugehen, dass das Gerät wie vorgesehen läuft. Code, der auf einem Jailbroken-Gerät ausgeführt wird, kann wahrscheinlich immer noch zu den meisten, wenn nicht allen Daten gelangen.
Diese Methode wird beim Starten der Anwendung nur einmal aufgerufen. Also erstellen Sie Ihren zufälligen Schlüssel:
%Vor%Tags und Links iphone ios encryption aes