Passwort in einem Skript unkenntlich machen

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.
JPohlmann
User
Beiträge: 7
Registriert: Freitag 2. April 2004, 22:52

Freitag 2. April 2004, 22:59

Hallo,

ich bin noch relativ unwissend, was Python anbelangt und habe folgendes Problem:

Ich arbeite an einem Verwaltungsprogramm für einen Internetshop, das mit Hilfe des MySQLdb-Moduls Verbindung zu einem MySQL-Server im Internet aufbaut. Um diese Verbindung herzustellen muss im Skript selbst natürlich das Passwort angegeben werden, sonst bekommt man logischerweise keinen Zugang zur Datenbank.

Wen ich das Programm nicht kompiliere (denn damit habe ich noch etwas Schwierigkeiten), wie kann ich das Passwort im Skript unkenntlich machen? Soweit ich das erkennen kann, kann man es theoretisch auch aus der .pyc-Datei noch herauslesen.

Die Zeile für die Verbindung lautet:

Code: Alles auswählen

MySQLdb.Connect(host="[server]", user="[benutzer]", passwd="[passwort]", db="[datenbank]")
wobei die eckigen Klammern Platzhalter darstellen.

Danke schon mal im Vorraus,
Jannis
Sneaker
User
Beiträge: 52
Registriert: Montag 19. Januar 2004, 22:19
Wohnort: Vor meinem Computer
Kontaktdaten:

Samstag 3. April 2004, 01:07

Das kann man nicht vollkommen schützen selbst wenn man es in ein exe programm packt, kann man es noch auslesen.
du könntest es aber in einer ander anderen datei auslagern, z.B. eine Ini Datei und was nützt einem das unkenntlich machen... hat man herraus gefunden wie es verschlüsselt wurde kann man es wieder zurück entschlüsseln.
JPohlmann
User
Beiträge: 7
Registriert: Freitag 2. April 2004, 22:52

Samstag 3. April 2004, 01:27

Nun ja, stell dir vor, du stellst jemandem ein solches Programm mit Klartext-Passwort zur Verfügung und der guckt sich einmal kurz den Python-Quellcode an und kennt sofort alle Zugangsdaten - dann kann er in deiner Datenbank machen, was er will.

Da muss es doch eine Möglichkeit geben, zumal z.B. eine MD5-Verschlüsselung nicht einfach so entschlüsselbar ist. Da ich weiß, dass der, für den ich mein Programm schreibe, in diesem Fall programmiertechnisch nicht sehr bewandert ist, kann ich natürlich mit dem base64-Modul arbeiten - aber auch da braucht es nur ein paar Sekunden und man hat den Klartext, weil base64 schnell zu entschlüsseln ist.
Christopy_ohne_login

Samstag 3. April 2004, 02:04

Dafür gibts Benutzerrechte bei Datenbanken. Gib Deinem Partner nur die Rechte, die er für seine Aufgabe braucht und er soll sich mit seinem Namen und seinem Passwort zur Laufzeit anmelden.
Passwörter speichern ist eine schlechte Idee.
JPohlmann
User
Beiträge: 7
Registriert: Freitag 2. April 2004, 22:52

Samstag 3. April 2004, 02:27

Dafür gibts Benutzerrechte bei Datenbanken.
Ich sagte, ich sei in Python nicht sehr bewandert, auf MySQL (bzw. allgemein Internetbezogenes) trifft das weniger zu.
Gib Deinem Partner nur die Rechte, die er für seine Aufgabe braucht
...wofür man einen eigenen Server bzw. die Möglichkeit, die Rechtetabelle des MySQL-Servers bearbeiten zu können, haben müsste. Wenn ich eins von beidem hätte, wäre das Problem kein Problem, das weiß ich auch.
JPohlmann
User
Beiträge: 7
Registriert: Freitag 2. April 2004, 22:52

Samstag 3. April 2004, 05:27

Das Problem hat sich in meinem Fall durch eine Umstrukturierung der Datenbanken - ich habe mehrere Datenbanken auf mehreren Servern, die habe ich nun etwas umgelegt - erledigt, trotzdem interessiere ich mich nach wie vor für eine Lösung dieser Problematik.
Zuletzt geändert von JPohlmann am Samstag 3. April 2004, 20:50, insgesamt 1-mal geändert.
oenone
User
Beiträge: 75
Registriert: Mittwoch 27. August 2003, 14:39
Wohnort: 49°17'28N, 8°15'57E
Kontaktdaten:

Samstag 3. April 2004, 08:29

JPohlmann hat geschrieben:Da muss es doch eine Möglichkeit geben, zumal z.B. eine MD5-Verschlüsselung nicht einfach so entschlüsselbar ist.
MD5 ist keine verschluesselung und zu entschluesseln geht das auch nicht, das ist eine einbahnstrasse.
Wenn du Passwoerter in eine DB speichern willst, solltest du immer _nur_ den MD5-Hash und nicht den Klartext.

auf bald
oenone
if you don't remember something, it never happened.
if you aren't remembered, you never existed.
i don't quite understand what love is like... but if there was someone who liked me, i'd be happy.
Milan
User
Beiträge: 1078
Registriert: Mittwoch 16. Oktober 2002, 20:52

Samstag 3. April 2004, 08:57

Hi. Es gibt keine Möglichkeit, dass so einfach unkenntlich zu machen. Sha und md5 sind wie schon gesagt nur fingerprints, und aus einem Fingerabdruck kann man nicht wieder den ganzen Menschen herstellen... man kann ihn nur zweifelsfrei identifizieren.

Ich würde die empfehlen, dich nach richtiges Verfahren umzuschauen (z.B. DES, PGP...) und die dann auf eine ausgelagerte DAtei anzuwenden. Aber selbst dann muss du wieder das Passwort für die entschlüsselung sichern... also nicht so einfach, wie die Handhabung über Rechte/jedesmal neu eingabe des Passwortes.

Milan
Milan
User
Beiträge: 1078
Registriert: Mittwoch 16. Oktober 2002, 20:52

Samstag 3. April 2004, 20:22

Peter Gerlach hat geschrieben:ich weiß nicht, warum sich hier alle wenden, wie die gebrannten Kinder. Natürlich kann man ein PW im Script unkenntlich machen, indem man es verschlüsselt im Scipt vorhält und eine Funktion den Klartext erst während der Laufzeit generiert. Schau dazu mal auf meine Webseite:

http://www.way2python.de,

in der Kategorie, Lösungsansätze, kommentiert. Da habe ich so ein Beispiel drin.
Hi. Das hat trotzdem 2 Nachteile: 1. braucht es trotzdem eine Nutzereingabe, um das passwd wieder zu erhalten und 2. ist rotor unsicher: "DeprecationWarning: the rotor module uses an insecure algorithm and is deprecated". Also net so ganz das gelbe vom Ei...

Eine andere Funtion wäre erst recht unsicher, solange sie keine Art "Einwegfunktion" darstellt...

Milan
hans
User
Beiträge: 728
Registriert: Sonntag 22. September 2002, 08:32
Wohnort: Sauerland
Kontaktdaten:

Samstag 3. April 2004, 20:22

Peter Gerlach hat geschrieben:ich weiß nicht, warum sich hier alle wenden, wie die gebrannten Kinder.
  • * Weil man durch Windows erkannt hat, wie wichtig passworte sein können
    * Weil man es Python nicht so richtig verstecken kann. Es kommt höchstens ein Password Ultralight heraus
    * Weil man das Rad nicht immer wieder nenu erfinden muß, denn ich glaube, dass MySql für eine Userverwaltung alles mitbringt.
    * Weil ich Bauchschmerzen habe, wenn ich ein Password in die Codierung einbauen soll, egal ob Shell Script, Delphi, Python oder sonst etwas.
    * Wenn man es aber richtig macht, dann sicher einem voriger Punkt den Arbeitsplatz, weil man das ja nicht kommentiert und bei jedem Passwortwechsel der Sourcecode geändert werden muß.
Die Liste erhebt keinen Ansprich auf Vollständigkeit und gibt auch nur meine Erfahrung und Meinung wieder. Der kann man folgen, oder auch nicht.

Wir sollten die Diskussion aber hier nicht ausweiten, dass bringt JPohlmann nämlich nicht weiter

Hans
JPohlmann
User
Beiträge: 7
Registriert: Freitag 2. April 2004, 22:52

Samstag 3. April 2004, 21:14

Weil ich Bauchschmerzen habe, wenn ich ein Password in die Codierung einbauen soll, egal ob Shell Script, Delphi, Python oder sonst etwas.
Das sehe ich prinzipiell ein, deswegen habe ich meine Datenbanken etwas umstrukturiert. Andererseits ist es ja z.B. so, dass man, wenn man in einem Program eine eigene Benutzerverwaltung programmieren will, doch so etwas ähnliches benötigt.
Aber da ließe sich wahrscheinlich vortrefflich so arbeiten, dass man beim erstmaligen Festlegen des Passworts die Eingabe eindeutig und "unkenntlich" (z.B. mit MD5) in einer Datei speichert und dann beim Einloggen die neue Eingabe mit derselben Methode verschlüsselt und dann mit der alten, bereits verschlüsselten vergleicht.
Die Rückverwandlung bedingt leider immer die Möglichkeit, das Passwort sichtbar zu machen, bei meiner Problemstellung muss ich dann einfach auf die MySQL-Benutzerverwaltung "ausweichen", also das Passwort dem Klienten offenbaren.

Gruss,
Jannis
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

Samstag 3. April 2004, 22:54

Hallo zusammen,

eine Möglichkeit, wäre es, die Decodierfunktion, für das im Quelltext enthaltene Passwort, von einem Computerspezifischen Parameter, z.B. dem Hostnamen abhängig zu machen. Natürlich müsste dann für jeden Rechner mit einem zweiten Script, daß Du nicht weiter gibst, das Passwort codiert und in das für diesen Rechner bestimmtes Script eingetragen werden.

Script zum verschlüsseln. Das Script, wird mit dem Hostname des Rechners für den das Passwort verschlüsselt werde soll und dem Passwort, als Argumente aufgerufen :

Code: Alles auswählen

import random, sys

def encrypt(hostname, passwort):
    rnd = random.Random(sum([ord(a) for a in hostname]))
    return "".join([chr(ord(a) ^ rnd.randint(0,127)) for a in passwort])

print repr(encrypt(sys.argv[1], sys.argv[2]))
hostname ist der name des Rechners, auf dem das script lauffen soll, nicht der name des Rechners auf dem die MySQL-Datenbank läuft!

Script mit verschlüsseltem Passwort. Das Script wird ohne Parameter aufgerufen und gibt das entschlüsselte Passwort zurück.

Code: Alles auswählen

import random, socket

def decrypt(epw):
    hostname = socket.gethostname()
    rnd = random.Random(sum([ord(a) for a in hostname]))
    return "".join([chr(ord(a) ^ rnd.randint(0,127)) for a in epw])

print decrypt('Ul|Xi\x1f') # Na wer entschlüsselt diesen uns allen sehr gut bekannten Begriff?
Bei euch wird beim zweiten Script mit grosser Warscheinlichkeit nur zeichenmüll rauskommen.
Bei mir kommt das raus.

Code: Alles auswählen

>>> print decrypt('Ul|Xi\x1f')
Python
wirklich sicher ist das natürlich auch nicht, und auch umständlich, da für jeden Rechner auf dem das Script laufen soll, das Passwort extra verschlüsselt und in den Source eingetragen werden muss.


Gruß

Dookie
Zuletzt geändert von Dookie am Samstag 3. April 2004, 22:59, insgesamt 1-mal geändert.
hans
User
Beiträge: 728
Registriert: Sonntag 22. September 2002, 08:32
Wohnort: Sauerland
Kontaktdaten:

Samstag 3. April 2004, 22:56

Jepp, dass mir dem MD5 Wert ist akzeptiert.

Aber warum mache ich da Kopfstände, wenn doch MySql allws mirbringt.

Code: Alles auswählen

create tabele abc..........
create user heinbloed..........
grant select on abc to heinbloed
oder so ähnlich. habe die Syntax nicht ganz im Kopf. Uns somit darf Hein Blöd die Tabelle lesen aber nicht beschreiben. Ist eigentlich gartnicht so schwer.

Hans
KurzBesuch

Donnerstag 15. April 2004, 15:32

Wir hatten fast das selbe Prolem! Letzt endlich haben wir dann einen LDAP-Server aufgesetzt mit dem es sich sehr gut macht!
Antworten