2012-03-28 22 views
4

Gibt es eine Möglichkeit, ein statisches Passwort so zu speichern, dass es in der kompilierten App wirklich schwer zu finden ist?Passwort im C-Quellcode verschlüsseln

Es gibt zwei verschiedene Apps, für die ich brauche. One ist ein leichter FTP-Client für Windows, der nur mit einem fest codierten Server verbunden ist. Der andere ist ein Objective-C-Spiel, mit dem Benutzer Level-Packs erstellen und mit Passwörtern speichern können. Sie können ohne Passwort gespielt, aber nicht im Level-Editor geöffnet werden. Ich verschlüssele die Passwörter mit AES, aber ich muss irgendwie das Kennwort für Entschlüsselung speichern.

Die einzige Idee, die ich bisher gefunden habe, ist das Speichern des Passworts nicht als eine Zeichenfolge, sondern als mehrere Zeichenfolgen. Das könnte wirklich gut für das Spiel funktionieren, weil ich nur Strings verbinden kann, die schon da sind. Oder ich könnte es als eine lange Zeichenfolge speichern und einen geheimen Algorithmus verwenden, um das Kennwort aus dieser Zeichenfolge abzurufen - obwohl das die Frage aufwirft: Können C-Anwendungen unter Windows oder Cocoa-Anwendungen unter OS X einfach dekomprimiert werden, um diesen Algorithmus zu finden?

Gibt es sicherere Möglichkeiten, das zu tun?

+0

Ich denke, eine wirklich simple Art, die immer noch wirksam gegen grundlegende Ressourceninspektion ist, ist das Speichern der Passwort-Zeichenfolge XOR'd mit einer Nummer (separat gespeichert). Dann XOR es mit der gleichen Nummer zu "entschlüsseln".Dies würde weder ernsthaften Dekompilierungsversuchen noch einer Speicherinspektion standhalten, insbesondere wenn Sie die dekodierte Zeichenfolge für längere Zeit im Speicher ablegen. – Bob

+3

http://en.wikipedia.org/wiki/Security_through_obscurity –

+0

Das (Sicherheit durch Dunkelheit) ist die Kategorie von Dingen wie das Zusammensetzen verschiedener Strings oder das XORing mit Zahlen, oder? Ich denke, ich werde nur einige Strings XOR, und verwenden Sie Wörter, die nicht wie ein Passwort klingen, wenn jemand aktiv nach einem sucht. Ich möchte nicht zu viel darüber nachdenken, denn es sieht so aus, als könnte jede Verschlüsselung durchbrochen werden, wenn der Angreifer die App auf seinem eigenen System hat. Vielen Dank für die Hinweise, wie nicht die dekodierte Zeichenfolge zu lange im Speicher zu halten :) –

Antwort

-2

String-Literale werden normalerweise beibehalten und irgendwo in der Binärdatei gespeichert, auch in kompilierter C-Quelle.

Was Sie tun könnten, ist eine ähnliche Methode, wie (ordnungsgemäß implementierte) Web-Apps Anmeldeinformationen validieren, wenn diese Informationen in einer Datenbank gespeichert sind. Speichern Sie das Passwort einfach in Hash-Form. Oft wird MD5 + -Salz verwendet (here is a description and some sample PHP code). Was Sie tun können, ist, anstatt das Klartext-Passwort zu übertragen oder zu speichern, einfach die Benutzereingabe zu überprüfen und den Hash-Wert mit dem gespeicherten Hash-Wert zu vergleichen. Übereinstimmende Hashes entsprechen übereinstimmenden Passwörtern.

EDIT

Dies wird allerdings nicht mit dem FTP-Server Fall helfen, da Sie nicht den Quellcode ändern ...

+0

Danke für die Antwort. Das könnte für das Passwort im Spiel funktionieren, aber nicht für die FTP-App oder für Level-Codes, die ich noch nicht einmal erwähnt habe. Mein schlechtes :) –

+0

Umgestaltet, wie für FTP würden Sie entweder den Hash als Passwort verwenden, was zu reinem Text, oder das Passwort selbst, und Hashing wäre eine Möglichkeit ... –

+0

Macht keinen Sinn. Hashing hilft hier nicht. – CodesInChaos

2

kann C-Anwendungen auf Windows oder Cocoa-Anwendungen auf OS X einfach dekompiliert werden, um diesen Algorithmus zu finden?

Ja, alle von Menschen gemachten können von einem anderen Menschen gebrochen werden. Nie verwenden reversible Algorithmen für die Speicherung sensibler Daten - sie werden rückentwickelt. Sie können Hashes speichern, wie sidran32 schrieb, aber es hilft Ihnen nicht mit Client

2

Warum durch den Schmerz von decompiling gehen - eine einfache

$strings <binary> 

es tun :) Speichern Sie Ihre Passwörter im Code wird nie funktionieren: Sie können sie teilen, kodieren, verschlüsseln, wie Sie wollen - es wird einen Punkt geben, an dem Sie die Teile wieder zusammenbauen müssen, um sie zu überprüfen. Und genau an diesem Punkt greift ein Angreifer ein, wahrscheinlich mit einem Debugger. Ich habe eine answer zu einer ähnlichen Frage mit mehr Details gegeben.

Der einzige wirklich sichere Weg ist das Speichern der Passwörter als Out-of-Band-Informationen, außerhalb Ihres Codes (oder der Binärdatei für diese Angelegenheit). Diese Art von DRM, an die Sie denken, funktioniert nie über einen längeren Zeitraum, wie Millionen von geknackten Microsoft- oder anderen Produkten beweisen.

+0

Ich wusste von dem Befehl strings, aber ich dachte, wenn ich ein Passwort wähle, das nicht wie ein Passwort aussieht, würden die Leute es nie finden. Wie funktioniert es mit einem Debugger? Könntest du die Zeichenfolge nur im Speicher finden, selbst wenn ich sie sofort veröffentliche? - Wie ich bereits sagte, ist mir klar, dass wenn jemand wirklich die Levelcodes finden möchte, könnten sie - ich meine, * alle * Verschlüsselungen mit genügend Aufwand kaputt gemacht werden. Ich suche nur nach einer Lösung, die die Mühe nicht wert ist. –

+0

@Alex Da Sie '__asm ​​{int 3};' 'in die Disassembly einer beliebigen ausführbaren Datei einfügen können, oder einfach nur einfach in den Lauf einbrechen, könnte der Angreifer das Programm an einem beliebigen Punkt im Programm sitzen lassen, im Wesentlichen pausiert fließen. Wenn die Zeichenfolge zu irgendeinem Zeitpunkt vollständig im Speicher vorhanden ist, ist sie anfällig, auch wenn Sie sie schnell freigeben. Und selbst wenn es freigegeben wird, bleibt die Zeichenfolge im Speicher, bis das Programm (oder eine andere) diesen Speicherplatz überschreibt.Darauf bezieht er sich. –

+0

Oh, okay - das wusste ich nicht. Also in jedem Fall könnte das Passwort in was 10 Sekunden gefunden werden? - Ich frage mich, ob es irgendwie helfen könnte, den Dateiinhalt (d. H. Das Level, das nicht geheim ist) zu verwenden und einen geheimen Algorithmus zu verwenden, um es in ein Passwort umzuwandeln. –

Verwandte Themen