2016-05-02 5 views
4

Ich arbeite an einer C++ Qt-Anwendung. Um den Benutzer im Falle eines Fehlers der Anwendung oder des Geräts, mit dem er verbunden ist, zu unterstützen, exportiert das Programm alle internen Einstellungen und speichert sie in einer gewöhnlichen Datei (zur Zeit csv). Diese Datei wird dann an die Firma gesendet (zB per Mail).Vermeiden/Erkennen der Manipulation einer exportierten Datei

Um unbemerkt Manipulationen der exportierten Einstellungen zu vermeiden (zB vom Benutzer nach dem Export von Hand), brauche ich eine Art Mechanismus, um dies zu erkennen.

Die Methode sollte so einfach wie möglich sein, da dies keine sehr kritische Information, aber immer noch effektiv ist.

Alles, was mir einfällt, wäre ein Hash oder eine Verschlüsselung, aber ich bin mir ziemlich sicher, dass es dafür bereits eine einfache und elegante Lösung gibt.

Antwort

1

Sie können eine der verschiedenen Arten von Digests oder kryptografischen Signaturschemata verwenden. Da dies offline ausgeführt werden muss, muss Ihre ausführbare Datei ein Geheimnis enthalten - sei es ein öffentlicher Schlüssel, der für die Verschlüsselung mit öffentlichem Schlüssel verwendet wird, oder Sie können sich niemals selbst gegen einen entschlossenen Angreifer schützen. Ein einfaches Schema, das ohne Reverse-Engineering nicht umgangen werden kann, wird ausreichen; Wenn jemand einen Reverse-Engineering durchführen kann, bist du sowieso fertig.

Ein einfaches Schema wäre es, den Inhalt der Datei mit einem angehängten (oder vorangestellten) privaten Geheimnis zu hashen und den Hash am Ende der Datei anzuhängen. Auf der Empfängerseite überspringen Sie den Hash, fügen das Geheimnis hinzu, wiederholen das Hash und vergleichen.

Zum Beispiel eine einfache Möglichkeit, es in Qt zu tun wäre, um den Inhalt mit einem Hex-Darstellung eines SHA-256 der Inhalte mit einem geheimen ihnen beigefügten anhängen:

static const kHexSealSize = 2+64; // hex SHA-256 
static QByteArray kSecret { "Things taste bad without salt." }; 

QByteArray sealHash(const QByteArray & data, int size = -1) { 
    if (size < 0) size = data.size(); 
    QCryptographicHash hash(QCryptographicHash::Sha256); 
    hash.addData(data.constData(), size); 
    hash.addData(kSecret); 
    auto seal = QByteArray("\r\n") + hash.result().toHex(); 
    Q_ASSERT(hex.size() == kHexSealSize); 
    return seal; 
} 

QByteArray seal(const QByteArray & data) { 
    return data + sealHash(data); 
} 

/// Returns whether a seal is valid 
bool checkSeal(const QByteArray & data) { 
    if (data.size() < kHexSealSize) return false; 
    auto hexSrc = data.right(kHexSealSize); 
    auto hexCmp = sealHash(data, data.size() - kHexSealSize); 
    return hexSrc == hexCmp; 
} 
+0

Ich werde wahrscheinlich Ihren Ansatz verwenden, oder tun Sie Folgendes: Tun Sie, wie Sie vorgeschlagen haben, und fügen Sie dann den Hash an den Dateinamen an. Die Person, die den Bericht überprüft, kann leicht bestätigen, dass der Datensatz gültig ist. Dafür braucht er keine Werkzeuge. Ein einfacher Befehl sha256sum würde es tun. Natürlich ist dies nicht sicher, wie Sie bereits angedeutet haben, und Reverse Engineering wäre ziemlich einfach, aber ich denke, es ist besser als nichts und einfach zu implementieren. – user3482407

1

Um Änderungen zu verhindern/zu erkennen, führt der Standardweg das Signieren von Nachrichten durch. Ob es einfach ist oder nicht, hängt davon ab, mit welchem ​​Werkzeug/welcher Bibliothek Sie solche Aufgaben ausführen. Für den Augenblick bieten openssl die Dateisignierungsfunktion sowohl als Befehlszeilen- als auch als Bibliotheksfunktion an.

+0

würde nicht ich als ein Zertifikat zum Signieren mit jeder Anwendung geben zu müssen? – user3482407

1

Hier sind ein paar Dinge, die Sie nutzen könnten:

  • Verwenden Sie eine Prüfsumme/Hash der Datei, und es auf dem Server vergleichen. Sie können den Hash in einer separaten Datei speichern, der Datei selbst (Sie müssten die Datei ändern, um den Hash zu entfernen), als eine Art Kunden-Support-Code verwenden oder die Datei nach dem Hash benennen.
  • Verschlüsseln die Datei, Benutzer sollten nicht in der Lage sein, es wieder zu entschlüsseln, zu ändern und zu verschlüsseln.
  • Starten Sie einen separaten Prozess, die die Datei im Speicher speichert, löscht es und sendet dann die Datei (wenn der Benutzer keine Verbindung hat, warten, bis er hat) - Der Benutzer konnte den Prozess beenden, dann die Information ist verloren (wenn nicht, ist es auf der Platte, auf die er zugreifen kann), die Verschlüsselung würde diesen Versuch zum Beispiel blockieren.
  • Ändern Sie die Erweiterung der Datei (z. B. zu .dat). Dies ist vielleicht nicht der beste Weg sein, aber wenn die Benutzer nicht wissen, die Datei eine csv Datei, Sie könnten damit durchkommen (Sicherheit durch Verschleierung ist schlecht) :)

Ich persönlich würde die Datei verschlüsseln , da dies der einfachste Weg ist, es zu implementieren. Es würde auch jeden Versuch blockieren, es zu ändern, ohne viel Ärger (im Gegensatz zu den anderen Möglichkeiten).

+0

Checksum/Hash -> Was passiert, wenn der Benutzer die Datei öffnet, bearbeitet, den Hash neu berechnet und dann speichert; Verschlüsselung -> brauche einen geheimen Schlüssel, der dann in Klartext in der Anwendung gespeichert wird; Starten Sie einen separaten Prozess -> Ich möchte die Datei, der Benutzer sollte wählen, wie man die Datei an uns sendet; Vielleicht gibt es eine noch bessere Lösung da draußen – user3482407

+0

@ user3482407 Sie – Rakete1111

+0

ein Salz auf die Daten zum Beispiel hinzufügen könnten Aber wie kann ich überprüfen, ob die Datei korrekt ist, wenn ich zu der Zeit nicht das Salz habe (da der Bericht exportiert wird) oder wenn das Salz der Datei hinzugefügt wird, kann der Benutzer der Datei ein eigenes Salz hinzufügen;) – user3482407

Verwandte Themen