Config-Datei verschlüsseln

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
droptix
User
Beiträge: 521
Registriert: Donnerstag 13. Oktober 2005, 21:27

Ein Programm braucht eine Config-Datei (INI). Weil Passwörter drin stehen möchte ich die gern verschlüsselt ablegen. Eigentlich macht es Sinn, gleich die gesamte INI-Datei zu verschlüsseln.

Welchen Algo sollte man wählen? Ich denke mit AES fährt man ganz gut, oder? Dafür gäbe es ja pycrypto.
lunar

Ich würde dir außerdem nicht zu pycrypto raten... Das ist zwar ein gutes Modul, was Umfang und Implementation der Algorithmen angeht, aber es ist sehr grundlegend.

Es bietet iirc keine Funktionen zum Ableiten von Schlüsseln aus Passwörtern, kein Padding, etc. Um eine Konfigurationsdatei zu Verschlüsseln, muss man einiges drumrum programmieren, was die ganze Sache potentiell angreifbar macht. Außerdem musst du dich um das Speichern oder das Abfragen des Schlüssels selbst kümmern.

Ich an deiner Stelle würde auf etwas Etabliertes zurückgreifen. Du könntest z.B. gnupg zum Verschlüsseln der Passwörter nehmen.

Außerdem würde ich die Passwörter unbedingt in einer separaten Datei ablegen. Dann musst du die Passwörter nämlich erst dann entschlüsseln wenn du sie wirklich benötigst. Speicherst du dagegen alles in einer Konfigurationsdatei und verschlüsselst diese, so musst die alles (auch die Passwörter) entschlüsseln, nur um z.B. die Option für einen Download-Ordner oder die Verbosity auszulesen.
droptix
User
Beiträge: 521
Registriert: Donnerstag 13. Oktober 2005, 21:27

Ich muss sowieso die ganze Config einlesen, weil ich alle Angaben gleichzeitig brauche. Es ist nur eine Hilfe, dass der arme Anwender nicht jedesmal alles neu eingeben muss. Ich würde die Passwörter aber ungern unverschlüsselt rumliegen lassen... Prinzipsache. Es geht mir nicht um maximalen Schutz.

Was ist mit ezPyCrypto und yawPyCrypto?
Auszug aus [url=http://www.freenet.org.nz/ezPyCrypto/detail/public/ezPyCrypto.key-class.html#encString]ezPyCrypto[/url] hat geschrieben:encString(self, raw)

Encrypt a string of data

High-level func. encrypts an entire string of data, returning the encrypted string as binary.
Arguments:

* raw string to encrypt

Returns:

* encrypted string as binary

Note - the encrypted string can be stored in files, but I'd suggest not emailing them - use encStringToAscii instead. The sole advantage of this method is that it produces more compact data, and works a bit faster.
Tja, wie und mit welchem Algo wird denn da encryptet? Kann ich da keinen Key festlegen? Dann kann ja sicher jeder der Python hat den encrypteten Binary-String wieder decrypten...
lunar

droptix hat geschrieben:Ich muss sowieso die ganze Config einlesen, weil ich alle Angaben gleichzeitig brauche.
In diesem Fall würde ich dir wirklich zu gnupg raten, da man das über subprocess recht komfortabel steuern kann:

Code: Alles auswählen

# verschlüsseln
data = "In diesem String steht die Konfiguration"
process = subprocess.Popen(['gpg', '-o', 'configfile', '-c'],
                                         stdin=subprocess.PIPE)
process.communicate(data)
# entschlüsseln
process = subprocess.Popen(['gpg', '-d', 'configfile'],
                                         stdout=subprocess.PIPE)
# die Konfiguration landet auf stdout
data = process.communicate()[0]
Um z.B. ConfigParser in einer String schreiben zu lassen, kannst du StringIO nehmen, und denn erzeugten String dann auf die Pipe weiterleiten. Da bei dieser Methode keine temporären Dateien erzeugt werden, ist die Sache relativ sicher. Die Passwortabfrage geschieht automatisch, sofern die richtigen pinetry-Frontends installiert sind.

Getestet habe ich das nicht, es sollte aber so ähnlich unter Linux laufen, von Windows weiß ich das nicht.
droptix
User
Beiträge: 521
Registriert: Donnerstag 13. Oktober 2005, 21:27

Ich möchte eine Python-Anwendung bauen, weil ich nicht von externen Programmen abhängig sein will. Daher finde ich ist das zu weit ausgeholt.

Wie gesagt: es muss nicht bombensicher sein. Ich will einfach nur keine Klartextpasswörter. Wäre nett, wenn das trotzdem relativ sicher ist, aber es muss halt nicht sein.

Gibt's keine simple Möglichkeit dafür? Mir reicht theoretisch auch ein ROT13... wehe jetzt lacht einer :twisted:
Mephisto
User
Beiträge: 28
Registriert: Mittwoch 17. Januar 2007, 15:52

Also wenn dir echt rot13 reicht, dann geht das ziemlich einfach:

Code: Alles auswählen

In [6]: "abcd".encode('rot13')
Out[6]: 'nopq'

In [7]: "nopq".decode('rot13')
Out[7]: u'abcd'
:)

greets meph
droptix
User
Beiträge: 521
Registriert: Donnerstag 13. Oktober 2005, 21:27

Cool! Was kann ich denn alternativ zu "rot13" angeben? Finde mal wieder nichts dazu in der Python-Doku. Die Funktion wird zwar aufgeführt, aber die Argumente nicht... nervt manchmal ganz schön.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

droptix hat geschrieben:Cool! Was kann ich denn alternativ zu "rot13" angeben?
Alle in Python registrierten Codecs. Du kannst auch eigene Codecs registrieren, womit man ganz lustige Sachen machen kann.
droptix hat geschrieben:Finde mal wieder nichts dazu in der Python-Doku. Die Funktion wird zwar aufgeführt, aber die Argumente nicht... nervt manchmal ganz schön.
Also ich sehe in der Python Doku durchaus eine lange Liste mit eingebauten Codecs ;) Da sind neben den "normalen" Encodings wie Latin-1 (ISO-8859-1) auch eben auch UUEncode, Base64 und auch noch weitere.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Mephisto
User
Beiträge: 28
Registriert: Mittwoch 17. Januar 2007, 15:52

Wo das in der Doku steht weis ich leider auch nicht genau, aber in encodings.aliases.aliases ist ein Dictionary mit allen Encodings.
Alternativ zu rot13 würde sich vielleicht base64 eignen.

Hm, da war einer schneller, naja schadet auch nicht :)

greets meph
droptix
User
Beiträge: 521
Registriert: Donnerstag 13. Oktober 2005, 21:27

Leonidas hat geschrieben:Also ich sehe in der Python Doku durchaus eine lange Liste mit eingebauten Codecs
Ohoooo, aber diese Liste hätte man mal bei String.encode() verlinken können. Muss man ja erstmal wissen, dass alle Codecs gehen.

Das ist ja ne ziemlich lange Liste. Welcher Codec eignet sich eurer Meinung nach am besten, um den String so gut wie möglich zu verschleiern? Wie wär's mit "macturkish"? :D meph meinte dazu schonmal:
Mephisto hat geschrieben:Alternativ zu rot13 würde sich vielleicht base64 eignen.
Immer dran denken: ich will damit nur das Maximum rausholen und keine 100%-ige Sicherheit. Danke!
Zuletzt geändert von droptix am Freitag 20. April 2007, 18:16, insgesamt 1-mal geändert.
darkfrog
User
Beiträge: 26
Registriert: Mittwoch 19. Juli 2006, 16:19

Man könnte auch einfach nur einen Hash (z.B. md5) des Passwortes in der Datei abspeichern und diesen dann mit der Eingabe vergleichen.
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

darkfrog hat geschrieben:Man könnte auch einfach nur einen Hash (z.B. md5) des Passwortes in der Datei abspeichern und diesen dann mit der Eingabe vergleichen.
Dann sollte man das Passwort aber noch so verändern, dass daraus nicht direkt der MD5-Wert gebildet wird. Sonst könnte jeder die Config-Datei nach seinen "Bedürfnissen" anpassen, indem er selber einen Wert einträgt.

Außerdem nützt das nichts, wenn man beispielsweise zu einer Datebank eine Verbindung aufbauen möchte, oder seine E-Mails abrufen will.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

darkfrog hat geschrieben:Man könnte auch einfach nur einen Hash (z.B. md5) des Passwortes in der Datei abspeichern und diesen dann mit der Eingabe vergleichen.
Ja, das ist eine Idee, am besten mit Salt. Aber nicht immer sind Hashes eine gute Idee. So ist es nicht möglich Passwörter zu speichern, die später im Klartext noch verfügabr sein müssen.

Eine der normalen Datei-Encodings würde ich nciht nehmen. Denn UTF-8 oder Latin-1 oder Latin-9 unterscheiden sich bei ASCII-Zeichen nicht, und Türkisch hat auch nicht so viele Sonderzeichen, somit ist es gut möglich, dass es auch als Macturkish kodiert noch problemlos lesbar ist: siehe ``'abc'.encode('macturgish')``.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
EnTeQuAk
User
Beiträge: 986
Registriert: Freitag 21. Juli 2006, 15:03
Wohnort: Berlin
Kontaktdaten:

Also ich hatte vor langer Zeit mal die gleiche Problematik ;)
Ich habe für das Problem einfach base64.base16 genommen. Das sieht genial aus, keiner kanns mehr lesen und es ist extrem leicht zu verarbeiten *grinz*
(um vllt. noch ein wenig mehr Sicherheit hinzuzubringen, kann man ja einfach automatisch zwei Buchstaben an den Anfang und das Ende hängen. Damit ist das ganze auch nicht gleich automatisch für Leute lesbar, die `base16` erkennen und es knacken wollen.

Ist ne sehr easy Lösung finde ich. ;)

MfG EnTeQuAk
droptix
User
Beiträge: 521
Registriert: Donnerstag 13. Oktober 2005, 21:27

Ich brauche die Passwörter im Klartext, muss sie also wieder decodieren können. Daher kein Hash wie MD5.

Die Variante von EnTeQuAk gefällt mir und ist für meine Zwecke völlig ausreichend. Ich denke ich werde einfach "base64" und "rot13" kombinieren.

Thanks a lot! :D
droptix
User
Beiträge: 521
Registriert: Donnerstag 13. Oktober 2005, 21:27

Da wir anfangs mal den `ConfigParser` angeschnitten hatten: Der soll mir meine INI ja einlesen. Zuvor muss ich sie eben nur decodieren.

Das Problem was ich grad entdeckt hab: `ConfigParser` kann nur von einem Fileobject lesen. Ich kann keinen String übergeben. Wie löst man dieses Problem? Kann ich eine Art virtuelles Fileobject erstellen, welches nicht erst auf Platte geschrieben werden muss?
rayo
User
Beiträge: 773
Registriert: Mittwoch 5. November 2003, 18:06
Wohnort: Schweiz
Kontaktdaten:

Hi

Schau das Modul StringIO an.

Gruss
droptix
User
Beiträge: 521
Registriert: Donnerstag 13. Oktober 2005, 21:27

rayo hat geschrieben:Schau das Modul StringIO an.
Na wunderbar. Hat geklappt, danke!
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

"suche pure Python crypt Algo...": http://www.python-forum.de/topic-8075.html

btw. Um es wirklich sicher zu machen, müßte man IMHO ein Master-Passwort nehmen, welches der User eingeben muß, um die anderen Passwörter "freizuschalten"... Ohne so etwas ist das ganze nur ein leicht zu durchschauendes durcheinander würfeln...

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
droptix
User
Beiträge: 521
Registriert: Donnerstag 13. Oktober 2005, 21:27

Danke. Ich denke aber es reicht mit dem durcheinander würfeln. Ist nichts sicherheitskritisches. Die INI Datei wird eigentlich auch nur auf einem Rechner abgelegt, auf den nur ich Zugriff habe. Die Verschlüsselung ist nur für alle Fälle...
Antworten