106 Stimmen

Techniken zur Verschleierung sensibler Zeichenketten in C++

Ich muss sensible Informationen (einen symmetrischen Verschlüsselungsschlüssel, den ich geheim halten möchte) in meiner C++-Anwendung speichern. Der einfache Ansatz ist dieser:

std::string myKey = "mysupersupersecretpasswordthatyouwillneverguess";

Wenn Sie die Anwendung jedoch über den strings Prozess (oder jeder andere, der Zeichenketten aus einer binären Anwendung extrahiert) wird die obige Zeichenkette aufdecken.

Welche Techniken sollten verwendet werden, um solche sensiblen Daten zu verbergen?

Edita:

OK, also haben so ziemlich alle von Ihnen gesagt "Ihre ausführbare Datei kann zurückentwickelt werden" - natürlich! Das ist eines meiner Lieblingsärgernisse, also werde ich hier ein bisschen schimpfen:

Warum werden 99% (OK, vielleicht übertreibe ich ein wenig) aller sicherheitsrelevanten Fragen auf dieser Website mit einem Schwall von "es gibt keine Möglichkeit, ein perfekt sicheres Programm zu erstellen" beantwortet - das ist keine hilfreiche Antwort! Sicherheit ist eine gleitende Skala zwischen perfekter Benutzerfreundlichkeit und keiner Sicherheit am einen Ende und perfekter Sicherheit aber keiner Benutzerfreundlichkeit am anderen Ende.

Der Punkt ist, dass Sie Ihre Position auf dieser gleitenden Skala wählen, je nachdem, was Sie zu tun versuchen und die Umgebung, in der Ihre Software laufen wird. Ich schreibe keine Anwendung für eine Militäreinrichtung, sondern eine Anwendung für einen Heim-PC. . Ich muss Daten über ein nicht vertrauenswürdiges Netz mit einem bekannten Verschlüsselungscode verschlüsseln. In diesen Fällen ist "Sicherheit durch Unklarheit" wahrscheinlich gut genug! Sicher, jemand mit genügend Zeit, Energie und Geschick könnte das Binärprogramm zurückentwickeln und das Passwort herausfinden, aber was soll's? Es ist mir egal:

Die Zeit, die ich benötige, um ein erstklassiges sicheres System zu implementieren, ist teurer als die Umsatzeinbußen durch die geknackten Versionen (nicht dass ich das tatsächlich verkaufen würde, aber Sie verstehen, worauf ich hinaus will). Dieser blauäugige "Wir machen es auf die absolut bestmögliche Art und Weise"-Trend in der Programmierung unter neuen Programmierern ist gelinde gesagt töricht.

Vielen Dank, dass Sie sich die Zeit genommen haben, diese Fragen zu beantworten - sie waren sehr hilfreich. Leider kann ich nur eine Antwort akzeptieren, aber ich habe alle nützlichen Antworten hochgestuft.

1voto

Michael Haephrati Punkte 3282

Versuchen Sie este . Der Quellcode erklärt, wie man alle Strings in einem gegebenen Visual Studio c++ Projekt verschlüsselt und entschlüsselt.

1voto

Zeeshan Punkte 499

Eine Methode, die ich kürzlich ausprobiert habe, ist diese:

  1. Nehmen Sie den Hash (SHA256) der privaten Daten und fügen Sie ihn in den Code ein als part1
  2. Nehmen Sie das XOR von privaten Daten und ihrem Hash und fügen Sie es in den Code ein als part2
  3. Daten befüllen: Nicht als char str[] speichern, sondern zur Laufzeit mit Zuweisungsanweisungen auffüllen (wie im Makro unten gezeigt)
  4. Generieren Sie nun die privaten Daten zur Laufzeit, indem Sie das XOR von part1 y part2
  5. Zusätzlicher Schritt : Berechnung des Hashwerts der generierten Daten und Vergleich mit part1 . Es wird die Integrität der privaten Daten überprüfen.

MACRO zum Auffüllen der Daten:

Angenommen, die privaten Daten bestehen aus 4 Bytes. Wir definieren dafür ein Makro, das die Daten mit Zuweisungsanweisungen in einer zufälligen Reihenfolge speichert.

#define POPULATE_DATA(str, i0, i1, i2, i3)\
{\
    char *p = str;\
    p[3] = i3;\
    p[2] = i2;\
    p[0] = i0;\
    p[1] = i1;\
}

Verwenden Sie dieses Makro nun im Code, wo Sie speichern müssen part1 y part2 wie folgt:

char part1[4] = {0};
char part2[4] = {0};
POPULATE_DATA(part1, 1, 2, 3, 4); 
POPULATE_DATA(part2, 5, 6, 7, 8);

0voto

mouviciel Punkte 64583

Anstatt den privaten Schlüssel in Ihrer ausführbaren Datei zu speichern, können Sie ihn vom Benutzer anfordern und mittels eines externen Passwort-Manager ähnlich wie bei Mac OS X Keychain Access.

0voto

Kontextabhängig, aber Sie könnten einfach die Hash des Schlüssels plus eine Salz (konstante Zeichenfolge, leicht zu übersehen).

Wenn der Benutzer dann den Schlüssel eingibt, fügen Sie die Salz berechnen Sie die Hash und vergleichen.

Le site Salz ist in diesem Fall wahrscheinlich unnötig, da es einen Brute-Force-Wörterbuchangriff verhindert, wenn der Hash isoliert werden kann (eine Google-Suche hat auch schon funktioniert).

Ein Hacker muss nur noch irgendwo eine jmp-Anweisung einfügen, um die ganze Sache zu umgehen, aber das ist etwas komplizierter als eine einfache Textsuche.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X