Verschlüsselungsmöglichkeiten bei Python

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.
Antworten
Citral
User
Beiträge: 12
Registriert: Dienstag 7. Juni 2016, 04:27
Kontaktdaten:

Hallo,

ich überlege als eines meiner ersten kleinen Projekte einen Passwortspeicher inkl. Generator zu programmieren und ihn auch anzuwenden :). Deswegen möchte ich meine Passwörter nicht in Plaintext in einer Datei oder Datenbank stehen haben.

Gibt es bei Python eine simple Möglichkeiten mit einem Masterpasswort diese zu verschlüsseln und diese auch wieder mit dem pw zu entschlüsseln?

passwort*masterpw= cryptedpw
cryptedpw/masterpw=passwort


Vielen dank im vorraus.
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

@Citral: für Cryptographie scheinen gerade zwei Pakete aktiv gepflegt zu werden: cryptography und PyCyptodome. Trotzdem kann man Verschlüsselung nicht blind anwenden. Man sollte schon genau wissen, was man da tut, um keine Lücken zu lassen, die die ganze Verschlüsselung umgehen können. Nimm am besten ein Buch zur Cryptographie Deiner Wahl und mach Dich mit der Materie vertraut.
DasIch
User
Beiträge: 2718
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

Citral hat geschrieben:ich überlege als eines meiner ersten kleinen Projekte einen Passwortspeicher inkl. Generator zu programmieren
Dafür benötigst du zusätzlich zu den notwendigen Python/Programmier Kenntnissen auch noch Kryptographische Kenntnisse. Das macht es nicht unbedingt zu einem schlechten ersten Projekt aber es kommt schon mit einer Barriere die vielleicht etwas höher als nötig ist.

[...]und ihn auch anzuwenden :).
Ganz schlechte Idee. Einer der absolut wichtigsten Dingen die du zu Kryptographie wissen solltest ist dass man sowas nicht einfach selbst baut, zumindest nicht um es ernsthaft anzuwenden.
Gibt es bei Python eine simple Möglichkeiten mit einem Musterpasswort diese zu verschlüsseln und diese auch wieder mit dem pw zu entschlüsseln?
Es gibt dazu nichts in der Standard Library und du würdest auch bei anderen Sprachen so etwas dort nicht finden.

Die von Sirius3 angesprochenen Pakete bieten dir da auch keine Lösung von an. Beide bieten Möglichkeiten zur symmetrischen Verschlüsselung an (wobei ich cryptographys Fernet Implementation gegenüber PyCryptodomes AES bevorzugen würde weil man bei ersterem weniger falsch machen kann). Es fehlt aber ein einfach zu benutzender Weg aus dem Musterpasswort einen Schlüssel zu generieren. Die Dokumentation beider Pakete geht darauf auch überhaupt nicht ein. Du müsstest dich also tiefergehend mit Key Derivation Functions beschäftigen.
Sirius3 hat geschrieben:Nimm am besten ein Buch zur Cryptographie Deiner Wahl und mach Dich mit der Materie vertraut.
Wobei man da auch aufpassen muss dass man sowohl ein gutes als auch ein aktuelles Buch wählt. Bücher in diesem Bereich altern nicht sonderlich gut.

Wenn es etwas moderner als ein Buch sein darf, würde ich Cryptography I auf Coursera empfehlen. Die Grundlagen werden dort gut und einfach verständlich ohne irgendwelche komplexe Mathematik vermittelt.
Citral
User
Beiträge: 12
Registriert: Dienstag 7. Juni 2016, 04:27
Kontaktdaten:

Hallo und danke für eure Antworten,

bitte nehmt es mir nicht übel, wenn ich mich ausführlich mit Kryptogrphie auseinandersetze. Mein Wissensstand reicht nicht aus, ich werde mich später wenn meine Skills dementsprechend sind, mich damit beschäftigen.

Einen eigenen Algorithmus zu entwickeln find ich zu hart, hatte darauf gehofft, dass es bereits welche gibt, die meinen Anforderung entsprechen und bin der Meinung auch etwas dazu gefunden zu haben.

Das Modul simplecrypt...

Code: Alles auswählen

from simplecrypt import encrypt, decrypt
pw = 'masterpw'
wpw = 'falschespw'
pw2 ='anderespw'
encrypt = encrypt(pw, pw2)
print(encrypt)

#decrypt1 = decrypt(wpw, encryptd)
#print(decrypt)
decrypt2 = decrypt(pw, encrypt)
print(decrypt2)


Also der Test scheint wunderbar zu funktionieren. das masterpw wird selbstverständlich nirgends gespeichert (wenn dann in sha256) und soll mit 'input' eingegeben werden.

Code: Alles auswählen

/usr/bin/python3.5 /home/home/python-foobar/src/test.py
b'sc\x00\x02\x03\x14\x11\xb1\x12\r\xd2>5\x0b\xffH\xc6j\xec\x01M\xe6^y\xbc\x1bwd\x1b\xe95\x1e{\x8cF\xf2\xb5\x15\xd8@p\xe9\xed\n\xc2\xd9\x147?\xa3\xdcF\xc4\x07\x11O\xa1P\x07w k:\x06g+_\xd5p\xe9l9sK\xc0\x7f\x1e'
b'anderespw'

Process finished with exit code 0
Habe ich hier etwas nicht berücksichtigt und wäre dies sicher genug?
Citral
User
Beiträge: 12
Registriert: Dienstag 7. Juni 2016, 04:27
Kontaktdaten:

hallo,
ich melde mich zurück nach stundenlangem ausprobieren.

Ich weiß nicht wie ich den verschlüsselten Code in einer Datei abspeichern und wieder aufrufen kann.
Wenn ich ihn einfach so mit weiteren nicht binären Werten versuche abzuspeichern, bekomme ich die Fehlermeldung zurück
TypeError: Can't convert 'bytes' object to str implicitly
Den Code einfach in UTF-8 zu encodieren funktioniert nicht, bekomme ne Fehlermeldung zurück, dass er die 4te Stelle nicht encodieren kann... In ISO-8859-1 schon, aber verursacht ungewollt Leerzeilen in der Datei und verändert grob die Struktur der Datei.

Versucht wird...
Wert1;Wert2;encryptedcode \n

abzuspeichern und auch wieder abzulesen

Hat jemand ne Lösung?
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

@Citral: was Du erhältst sind natürlich Binärdaten, weil nur Bytes verschlüsselt werden können, keine Zeichen. Daher mußt Du Deinen Text beim encrypten erst codieren (was simplecrypt scheinbar von alleine macht) und nach dem decrypten wieder decodieren, wie es auch in der Hilfe steht. Binärdaten in eine Text-Datei zu schreiben ist immer eine schlechte Idee. Du kannst sie aber als hex- oder base64-codierten Text speichern.
Citral
User
Beiträge: 12
Registriert: Dienstag 7. Juni 2016, 04:27
Kontaktdaten:

Sirius3 hat geschrieben:@Citral: was Du erhältst sind natürlich Binärdaten, weil nur Bytes verschlüsselt werden können, keine Zeichen. Daher mußt Du Deinen Text beim encrypten erst codieren (was simplecrypt scheinbar von alleine macht) und nach dem decrypten wieder decodieren, wie es auch in der Hilfe steht. Binärdaten in eine Text-Datei zu schreiben ist immer eine schlechte Idee. Du kannst sie aber als hex- oder base64-codierten Text speichern.
Wenn ich sie in hex oder base64 umcodiere bleiben es bei mir weiterhin binärdaten.

Gibts ne Möglichkeit binärdaten zu gewöhnlichen strings zu konvertieren?
Wenn ich es richtig verstanden habe ist es nicht möglich normalen Text/strings und binärdaten in eine datei zu speichern.. Entweder oder? Also wenn ich keine Lösung finde muss ich die binärdaten wohl in eine einzelne Datei schreiben und diese den anderen Werten zuordnen.

//edit

danke es hat über Umwege geklappt... bisschen umständlich aber simplecryptpw -> base64 -> utf-8 decode funktioniert
DasIch
User
Beiträge: 2718
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

Citral hat geschrieben:Also der Test scheint wunderbar zu funktionieren. das masterpw wird selbstverständlich nirgends gespeichert (wenn dann in sha256) und soll mit 'input' eingegeben werden.
SHA256 ist im großen und ganzen kaputt und nur noch eingeschränkt sicher nutzbar. Außerdem eignen sich einfache kryptographische Hash Funktionen wie SHA256 grundsätzlich nicht dafür um Passwörter zum speichern zu hashen. Dafür braucht man eine KDF wie pbkdf2, bcrypt, scrypt oder argon2.
BlackJack

@DasIch: Die Passwörter sollen verschlüsselt werden und nicht gehasht. Das soll wohl so was wie Keepass werden.

@Citral: Was sind denn in Deinem Beispiel Wert1 und Wert2 in der Datei? Bei einem Password-Safe sollte nichts unverschlüsseltes drin stehen. Denn auch Sachen wie URL und Benutzername können für einen Angreifer interessant sein wenn er diese Datei abgreift. In sofern würde ich die komplette Datei verschlüsseln und immer komplett lesen und schreiben.
Benutzeravatar
masterego
User
Beiträge: 12
Registriert: Mittwoch 15. Juni 2016, 16:41

Da fällt mir ein, was gelesen zu haben in dem CT-Programmieren-Magazin: Es ging da um einen sicheren Passwortmanager zu programmieren (Python).
ct'SESAM heisst das Projekt und folgende Links habe ich noch gefunden:
http://www.st.de/cs1602010
http://www.st.de/cs1602018
http://www.st.de/cs1602020
http://www.st.de/cs1602026

Vielleicht hilft das weiter,
Gruss
Benutzeravatar
masterego
User
Beiträge: 12
Registriert: Mittwoch 15. Juni 2016, 16:41

Ohje, sehe gerade, dass ich in den Links überall das 'ct' mit 'st' vertauscht habe, brauch wirklich dringend ne Pause :?

Nochmal die Links:
http://www.ct.de/cs1602010
http://www.ct.de/cs1602018
http://www.ct.de/cs1602020
http://www.ct.de/cs1602026
Benutzeravatar
darktrym
User
Beiträge: 784
Registriert: Freitag 24. April 2009, 09:26

Stellenweise ist das ja echt gruseliger Python Code.
„gcc finds bugs in Linux, NetBSD finds bugs in gcc.“[Michael Dexter, Systems 2008]
Bitbucket, Github
Benutzeravatar
masterego
User
Beiträge: 12
Registriert: Mittwoch 15. Juni 2016, 16:41

@darktrym

meinst du den code aus der CT ?
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Ich bin nicht darktrym, aber grobe Grausamkeiten sehe ich nicht. Dafuer aber auch nichts was man als gelungenes Beispiel fuer typisches Python betrachten kann.

Was da gezeigt wird ist Java-Code, der sich mit Python-Syntax tarnt: Zu viele ueberfluessige Klassen, die alle auch noch ein eigenes Modul haben. Da verging mir schon die Lust das weiter durchzusehen.
Antworten