Ich habe ein Python-Skript, das eine ODBC-Verbindung herstellt. Die ODBC-Verbindung wird mit einer Verbindungszeichenfolge generiert. In diese Verbindungszeichenfolge muss ich den Benutzernamen und das Passwort für diese Verbindung einfügen.
Gibt es eine einfache Möglichkeit, dieses Passwort in der Datei zu verschleiern (nur dass niemand das Passwort lesen kann, wenn ich die Datei bearbeite)?
Antworten:
Die Base64-Codierung befindet sich in der Standardbibliothek und kann Schulter-Surfer stoppen:
quelle
base64
das besser verschleiert alsrot13
in diesem Zusammenhang. Im Gegenteil,base64
hat seine typischen Eigenschaften (Gleichheitszeichen, ...) und ist somit leichter erkennbar als andere Ansätze. Eine Verschleierung hat jedoch keinen praktischen Nutzen. Wirklich schlecht, dass diese Antwort so hoch bewertet ist. Es gibt nur ein falsches Gefühl der Sicherheit ...base64
ist es vorzuziehen,rot13
wie es in der Python-Standardbibliothek ist.Douglas F Shearer's ist die allgemein anerkannte Lösung unter Unix, wenn Sie ein Kennwort für eine Remote-Anmeldung angeben müssen.
Sie fügen die Option --password-from-file hinzu , um den Pfad anzugeben und Klartext aus einer Datei zu lesen.
Die Datei kann sich dann im eigenen Bereich des Benutzers befinden, der vom Betriebssystem geschützt wird. Außerdem können verschiedene Benutzer automatisch ihre eigene Datei abrufen.
Für Kennwörter, die der Benutzer des Skripts nicht kennen darf, können Sie das Skript mit der angegebenen Berechtigung ausführen und die Kennwortdatei diesem Root- / Administratorbenutzer zuweisen.
quelle
Hier ist eine einfache Methode:
Dies sollte etwas sicherer sein als die Base64-Dekodierung - obwohl es für einen py_to_pyc-Dekompiler anfällig ist.
quelle
import peekabo
das Passwort verfügbar alspeekaboo.password
(falls peekaboo.py enthaltenpassword='secret'
)cythonizing
Ihrem Skript Wenn Sie die generierte Binärdatei freigeben, profitieren Sie von dieser Antwort. Fügen Sie eine weitere Verschleierungsebene hinzu, da Sie jetzt den C-Code dekompilieren müssen, um zum Kennwort zu gelangen. Dies ist nicht 100% sicher, aber es erfordert viel Arbeit, um zu den vertraulichen Daten zu gelangen, die Sie verbergen möchten.Wenn Sie auf einem Unix-System arbeiten, nutzen Sie das netrc-Modul in der Standard-Python-Bibliothek. Es liest Passwörter aus einer separaten Textdatei (.netrc), deren Format hier beschrieben ist .
Hier ist ein kleines Anwendungsbeispiel:
quelle
Die beste Lösung, vorausgesetzt, der Benutzername und das Kennwort können vom Benutzer zur Laufzeit nicht angegeben werden, ist wahrscheinlich eine separate Quelldatei, die nur eine variable Initialisierung für den Benutzernamen und das Kennwort enthält, die in Ihren Hauptcode importiert werden. Diese Datei muss nur bearbeitet werden, wenn sich die Anmeldeinformationen ändern. Andernfalls ist die Base 64-Codierung wahrscheinlich die einfachste Lösung, wenn Sie sich nur um Schulter-Surfer mit durchschnittlichen Erinnerungen sorgen. ROT13 ist einfach zu einfach manuell zu dekodieren, unterscheidet nicht zwischen Groß- und Kleinschreibung und behält im verschlüsselten Zustand zu viel Bedeutung. Codieren Sie Ihr Passwort und Ihre Benutzer-ID außerhalb des Python-Skripts. Lassen Sie das Skript zur Laufzeit zur Verwendung dekodieren.
Das Angeben von Anmeldeinformationen für Skripte für automatisierte Aufgaben ist immer ein riskanter Vorschlag. Ihr Skript sollte über eigene Anmeldeinformationen verfügen und das verwendete Konto sollte keinen anderen Zugriff haben als genau das, was erforderlich ist. Zumindest sollte das Passwort lang und eher zufällig sein.
quelle
Wie wäre es mit dem Importieren des Benutzernamens und des Passworts aus einer Datei außerhalb des Skripts? Auf diese Weise würde jemand, der das Skript erhalten würde, das Kennwort nicht automatisch erhalten.
quelle
base64 ist der richtige Weg für Ihre einfachen Bedürfnisse. Es muss nichts importiert werden:
quelle
Für die Python3- Verschleierung erfolgt die Verwendung
base64
anders:was in ... endet
und Dekodieren zurück zum ursprünglichen String
Um dieses Ergebnis zu verwenden, wenn Zeichenfolgenobjekte erforderlich sind, kann das Byteobjekt übersetzt werden
Weitere Informationen darüber, wie Python3 mit Bytes (und Zeichenfolgen entsprechend) umgeht, finden Sie in der offiziellen Dokumentation .
quelle
Dies ist ein ziemlich häufiges Problem. In der Regel ist das Beste, was Sie tun können, entweder
A) Erstellen Sie eine Art Ceasar-Verschlüsselungsfunktion zum Codieren / Decodieren (nur nicht rot13) oder
B) Die bevorzugte Methode besteht darin, einen Verschlüsselungsschlüssel zu verwenden, der in Reichweite Ihres Programms das Kennwort verschlüsselt / entschlüsselt. In dem Sie den Dateischutz verwenden können, um den Zugriff auf den Schlüssel zu schützen.
In diesem Sinne können Sie, wenn Ihre App als Dienst / Dämon (wie ein Webserver) ausgeführt wird, Ihren Schlüssel in einen kennwortgeschützten Schlüsselspeicher mit der Kennworteingabe als Teil des Dienststarts einfügen. Es wird einen Administrator benötigen, um Ihre App neu zu starten, aber Sie haben wirklich gute Voraussetzungen für Ihre Konfigurationskennwörter.
quelle
Ihr Betriebssystem bietet wahrscheinlich Möglichkeiten zum sicheren Verschlüsseln von Daten. Unter Windows gibt es beispielsweise DPAPI (Data Protection API). Fragen Sie den Benutzer beim ersten Ausführen nach seinen Anmeldeinformationen und entfernen Sie sie dann verschlüsselt für nachfolgende Ausführungen.
quelle
Mehr hausgemachte Vorgehensweise als Konvertierung von Authentifizierung / Passwörtern / Benutzernamen in verschlüsselte Details. FTPLIB ist nur das Beispiel. "" pass.csv " ist der Name der CSV-Datei
Speichern Sie das Passwort in CSV wie folgt:
Nutzername
Benutzer-Passwort
(Ohne Spaltenüberschrift)
Lesen Sie die CSV und speichern Sie sie in einer Liste.
Verwenden von Listenelementen als Authentifizierungsdetails.
Vollständiger Code.
quelle
Hier ist mein Ausschnitt für so etwas. Sie importieren oder kopieren die Funktion grundsätzlich in Ihren Code. getCredentials erstellt die verschlüsselte Datei, falls sie nicht vorhanden ist, und gibt ein Wörterbuch zurück. updateCredential wird aktualisiert.
quelle
Platzieren Sie die Konfigurationsinformationen in einer verschlüsselten Konfigurationsdatei. Fragen Sie diese Informationen in Ihrem Code mit einem Schlüssel ab. Platzieren Sie diesen Schlüssel in einer separaten Datei pro Umgebung und speichern Sie ihn nicht mit Ihrem Code.
quelle
Kennst du Grube?
https://pypi.python.org/pypi/pit (nur py2 (Version 0.3))
https://github.com/yoshiori/pit (es funktioniert auf py3 (aktuelle Version 0.4))
test.py
Lauf:
~ / .pit / default.yml:
quelle
/usr/lib/python3.7/site-packages/pit.py:93: YAMLLoadWarning: calling yaml.load() without Loader=... is deprecated, as the default Loader is unsafe. Please read https://msg.pyyaml.org/load for full details. return yaml.load(open(Pit._config))
Wenn Sie unter Windows ausgeführt werden, können Sie die win32crypt-Bibliothek verwenden. Es ermöglicht dem Benutzer, der das Skript ausführt, das Speichern und Abrufen geschützter Daten (Schlüssel, Kennwörter). Daher werden Kennwörter in Ihrem Code niemals im Klartext oder im verschleierten Format gespeichert. Ich bin nicht sicher, ob es eine gleichwertige Implementierung für andere Plattformen gibt. Mit der strikten Verwendung von win32crypt ist Ihr Code also nicht portierbar.
Ich glaube, das Modul ist hier erhältlich: http://timgolden.me.uk/pywin32-docs/win32crypt.html
quelle
Ich habe dies folgendermaßen getan:
An der Python-Shell:
Erstellen Sie dann ein Modul mit dem folgenden Code:
Sobald Sie dies getan haben, können Sie entweder mein Passwort direkt importieren oder das Token und die Verschlüsselung importieren, um sie nach Bedarf zu entschlüsseln.
Offensichtlich weist dieser Ansatz einige Mängel auf. Wenn jemand sowohl das Token als auch den Schlüssel hat (wie wenn er das Skript hätte), kann er leicht entschlüsseln. Es verschleiert sich jedoch, und wenn Sie den Code kompilieren (mit etwas wie Nuitka), wird Ihr Passwort zumindest nicht als einfacher Text in einem Hex-Editor angezeigt.
quelle
Dies beantwortet Ihre Frage nicht genau, ist aber verwandt. Ich wollte als Kommentar hinzufügen, war aber nicht erlaubt. Ich habe mich mit demselben Problem befasst, und wir haben beschlossen, das Skript den Benutzern mit Jenkins zur Verfügung zu stellen. Auf diese Weise können wir die Datenbankanmeldeinformationen in einer separaten Datei speichern, die verschlüsselt und auf einem Server gesichert ist und für Nicht-Administratoren nicht zugänglich ist. Es ermöglicht uns auch eine Abkürzung zum Erstellen einer Benutzeroberfläche und zum Drosseln der Ausführung.
quelle
Sie können auch die Möglichkeit in Betracht ziehen, das Kennwort außerhalb des Skripts zu speichern und zur Laufzeit bereitzustellen
zB fred.py
das kann wie laufen
Zusätzliche Schichten von "Sicherheit durch Dunkelheit" können durch Verwendung erreicht werden
base64
(wie oben vorgeschlagen) weniger offensichtliche Namen im Code verwendet werden und das tatsächliche Kennwort weiter vom Code entfernt wird.Wenn sich der Code in einem Repository befindet, ist es oft nützlich, Geheimnisse außerhalb des Repositorys zu speichern , sodass man dies hinzufügen kann
~/.bashrc
(oder einem Tresor oder einem Startskript, ...).und wechseln
fred.py
zudann erneut anmelden und
quelle
Warum nicht ein einfaches xor haben?
Vorteile:
Ich komme an den Punkt, an dem ich einfache b64-Zeichenfolgen für gebräuchliche Wörter und auch rot13 erkenne. Xor würde es viel schwieriger machen.
quelle
quelle
Es gibt mehrere ROT13-Dienstprogramme, die in Python im Internet geschrieben sind - googeln Sie einfach nach ihnen. ROT13 codiert die Zeichenfolge offline, kopiert sie in die Quelle und decodiert sie am Übertragungspunkt.
Aber das ist wirklich schwacher Schutz ...
quelle