PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [C++] Einstellungen verschlüsselt in .ini-Datei speichern


Gast
2010-07-15, 10:15:18
Moin!

Ich pflege derzeit eine Software, die ihre Einstellungen in der Windows-Registry speichert. Da das vorallem aus Sicht der Benutzerrechte dämlich ist, würde ich die Settings gerne in einer ini-Datei im Programmverzeichnis speichern. Die ini-Einträge würde ich bei dieser Gelegenheit aber gerne verschlüsselt haben. Ist das ohne großen Aufwand möglich? Habt ihr da Tipps auf Lager?

Pinoccio
2010-07-15, 10:32:37
Warum bzw. zum Schutz wovor bzw. vor wem möchest du verschlüsseln?

mfg

Neomi
2010-07-15, 11:43:07
Erstmal zur Ini-Datei:
Kein gute Idee, wenn du verschlüsseln willst. Die einzelnen Einträge sind meist sehr klein und die Syntax von Ini-Dateien ist einzuhalten, wenn du nicht selbst parsen, sondern die Windows-API für den Zugriff verwenden willst. Der eigentliche Sinn von einer textbasierten Konfigurationsdatei ist doch sowieso, sie auch per Texteditor editieren zu können. Wenn du das unterbinden willst, warum dann überhaupt noch eine Ini? Da ist dann ein Binärformat eher passend.

Zu "im Programmverzeichnis":
Darin haben Konfigurationsdateien nichts verloren, wirklich gar nichts. Auf den Ordner hast du nichtmal Schreibzugriff, wenn dein Programm auch mit weniger als Adminrechten laufen können soll. Für solche Zwecke gibt es deshalb eigene Verzeichnisse, die du z.B. per SHGetFolderPath abfragen kannst. CSIDL_APPDATA liefert dir einen Ordner für Applikationsdaten (z.B. Konfigurationsdaten) pro User, CSIDL_COMMON_APPDATA das gleiche userübergreifend.

Monger
2010-07-15, 12:20:12
Verschlüsselung ist immer heikel. Wenn man es richtig machen will, nutzt man Technologien wie z.B. Crypto Store.

Wie in der Realität auch ist eigentlich weniger das passende Schloss das Problem, sondern wo man den Schlüssel aufbewahrt. Stecken in der Ini Datei wirklich kritische Informationen? Wenn ja, was zur Hölle kann so wichtig sein, dass man es vor dem eigenen Anwender verbergen muss?

Gnafoo
2010-07-15, 16:46:03
Mit der DPAPI (http://msdn.microsoft.com/en-us/library/ms995355.aspx) kann man Daten so verschlüsseln, dass sie entweder nur derselbe User oder ein beliebiger User desselben Rechners wieder entschlüsseln kann (je nach Parameter). Dann sind die Daten effektiv mit dem Login des jeweiligen Users geschützt. Besonders gut ist das zwar nicht (jedes Programm mit User-Rechten kommt schließlich dran), aber ohne getrenntes Passwort ist es vermutlich noch das Beste, was man machen kann.

Gast
2010-07-15, 20:52:03
Danke erstmal für die Antworten! Die Sache mit der Verschlüsselung lass ich mal lieber sein, das ist tatsächlich unnötig.
Ich habe nun fogendes versucht:


...
std::ofstream outfile;
TCHAR szPath[MAX_PATH];

SHGetFolderPath(NULL, CSIDL_APPDATA, NULL, SHGFP_TYPE_CURRENT, szPath);

outfile.open("settings.ini");


In "szPath" steht nun der Benutzerordner, in dem ich die Settings-Datei speichern möchte. Die Funktion "open" is ja mehrfach überladen, nur bin ich irgendwie zu blöd, da jetzt noch richtig "szPath" reinzubekommen...

Markus89
2010-07-15, 21:08:47
strcat(szPath, "settings.ini");

Neomi
2010-07-15, 21:17:06
Da gibt es viele Möglichkeiten, die einfachste in dem Fall ist wohl diese:

SHGetFolderPath(NULL, CSIDL_APPDATA, NULL, SHGFP_TYPE_CURRENT, szPath);
PathAppend(szPath, _T("settings.ini"));
outfile.open(szPath);

Da du schon TCHAR verwendest, solltest du auch die entsprechenden Makros wie z.B. _T benutzen. Sonst kompiliert es nicht mehr, wenn du irgendwann auf Unicode umstellst.

@Markus89:
Wird so nicht richtig funktionieren, weil in deiner Variante noch der Backslash vor dem Dateinamen fehlt.

Coda
2010-07-15, 21:21:43
Oder ANSI einfach gleich komplett bleiben lassen.

Gast
2010-07-15, 21:37:06
SHGetFolderPath(NULL, CSIDL_APPDATA, NULL, SHGFP_TYPE_CURRENT, szPath);
PathAppend(szPath, _T("settings.ini"));
outfile.open(szPath);


Wenn ich das verwende, erhalte ich folgende Fehlermeldung:

1>xxxxx.obj : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol "__imp__PathAppendW@8" in Funktion "_wmain".
1>D:\VS_Projects\..... : fatal error LNK1120: 1 nicht aufgelöste externe Verweise.

Sephiroth
2010-07-15, 22:39:43
#include "Shlwapi.h"
und die Shlwapi.lib einbinden

siehe PathAppend (http://msdn.microsoft.com/en-us/library/bb773565%28VS.85%29.aspx)

Nasenbaer
2010-07-15, 23:13:01
Warum überhaupt die Daten mit einem mal nicht mehr in der Registry speichern? Du musst das ja nicht in HKEY_LOCAL_MACHINE reindonnern aber HKEY_LOCAL_USER ist doch aus Rechteverwaltungssicht kein Problem?!

Gast
2010-07-16, 08:48:04
Warum überhaupt die Daten mit einem mal nicht mehr in der Registry speichern? Du musst das ja nicht in HKEY_LOCAL_MACHINE reindonnern aber HKEY_LOCAL_USER ist doch aus Rechteverwaltungssicht kein Problem?!

Jein. Unter Windows XP ist es kein Problem aber unter Vista/7 kann ich als normaler Benutzer überhaupt nichts in die Registry schreiben.

Gast
2010-07-16, 10:27:15
Jein. Unter Windows XP ist es kein Problem aber unter Vista/7 kann ich als normaler Benutzer überhaupt nichts in die Registry schreiben.
Klar kannst du als normaler user unter Vista/Windows7 in deinen eigenen Registry Hive (HKCU) schreiben. o.0

Coda
2010-07-16, 12:58:37
Das kann ich bestätigen. HKLU ist natürlich beschreibbar. Ansonsten würde überhaupt nichts mehr laufen.

Gast
2010-07-16, 16:47:10
Ihr habt natürlich Recht, ich hatte nen kleinen Aussetzer :D