Seite 1 von 1

Passwort in einem Skript unkenntlich machen

Verfasst: Freitag 2. April 2004, 22:59
von JPohlmann
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

Verfasst: Samstag 3. April 2004, 01:07
von Sneaker
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.

Verfasst: Samstag 3. April 2004, 01:27
von JPohlmann
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.

Verfasst: Samstag 3. April 2004, 02:04
von Christopy_ohne_login
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.

Verfasst: Samstag 3. April 2004, 02:27
von JPohlmann
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.

Verfasst: Samstag 3. April 2004, 05:27
von JPohlmann
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.

Verfasst: Samstag 3. April 2004, 08:29
von oenone
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

Verfasst: Samstag 3. April 2004, 08:57
von Milan
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

Re: Passwort im Script unkenntlich machen

Verfasst: Samstag 3. April 2004, 20:22
von Milan
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

Re: Passwort im Script unkenntlich machen

Verfasst: Samstag 3. April 2004, 20:22
von hans
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

Verfasst: Samstag 3. April 2004, 21:14
von JPohlmann
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

Verfasst: Samstag 3. April 2004, 22:54
von Dookie
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

Verfasst: Samstag 3. April 2004, 22:56
von hans
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

Server

Verfasst: Donnerstag 15. April 2004, 15:32
von KurzBesuch
Wir hatten fast das selbe Prolem! Letzt endlich haben wir dann einen LDAP-Server aufgesetzt mit dem es sich sehr gut macht!

Verfasst: Donnerstag 15. April 2004, 20:41
von hans
Obwohl nicht so ganz sicher, gibt es da nicht eine Möglichkeit, ein Script auf dem Server in einem Verzeichnis zu hinterlegen, welches mittels .htaccess geschützt ist? Wenn da jemand mit Browser drauf möchte, benötigt er ein Passwort während die Restriktionen für cgi Scripte nicht bestehen.

Hans

Verfasst: Freitag 16. April 2004, 10:26
von JPohlmann
Sicherlich, die Möglichkeit besteht. Allerdings nur bei Web-Projekten, meines Wissens nicht bei normaler Software, die nur auf die Datenbank zugreifen will.

Verfasst: Freitag 16. April 2004, 20:58
von hans
Ja dann wäre das ne Überlegung wert. Das ganze als Webprojekt. Das kann man dann Betriebssystemunabhängig gestalten. Hat was!

Hans