Sicher Löschen Passwort im Speicher (Python)
Wie Sie speichern ein Passwort durch den Benutzer eingegeben, die im Speicher und löschen Sie es sicher, sobald Sie nicht mehr brauchen?
Zu erarbeiten, aktuell haben wir den folgenden code:
username = raw_input('User name: ')
password = getpass.getpass()
mail = imaplib.IMAP4(MAIL_HOST)
mail.login(username, password)
Nach dem Aufruf der login
Methode, was müssen wir tun, um zu füllen den Speicherbereich, enthält ein Passwort, mit unleserlichen Zeichen so, dass jemand nicht das Passwort wiederherstellen, indem Sie einen core dump?
Gibt es eine ähnliche Frage, allerdings ist es in Java und die Lösung setzt Zeichen-arrays:
Wie bewahrt man Passwort-hashes, die sicher im Gedächtnis, wenn Sie accounts erstellen?
Geht das in Python?
In der Nähe der Unterseite des IBM Artikel, Sie sprechen über die Verwendung einer veränderlichen Daten-Struktur, anstatt eine unveränderliche Zeichenfolge.
Der link zu den IBM-Artikel in der Kommentar oben nicht mehr funktioniert, verwenden Sie ein archivierte Seite.
Der link zu den IBM-Artikel in der Kommentar oben nicht mehr funktioniert, verwenden Sie ein archivierte Seite.
InformationsquelleAutor maxyfc | 2009-04-08
Du musst angemeldet sein, um einen Kommentar abzugeben.
Python nicht haben, dass niedrige einer Ebene der Kontrolle über den Speicher. Akzeptieren Sie es, und bewegen auf. Die besten Sie tun können, ist zu
del password
nach dem Aufrufmail.login
so dass keine Verweise auf die Passwort-string-Objekt bleiben. Jede Lösung, die vorgibt, in der Lage zu tun mehr als nur geben Ihnen ein Falsches Gefühl der Sicherheit.Python string-Objekte sind unveränderlich, es gibt keine direkte Möglichkeit so ändern Sie den Inhalt ein string, nachdem es erstellt wurde. Auch wenn Sie waren in der Lage, irgendwie überschreiben den Inhalt der Zeichenfolge bezeichnet, die durch
password
(was technisch möglich ist, mit dummen ctypes tricks), wäre es immer noch andere Kopien der Passwort erstellt wurden, die in verschiedene string-Operationen:Würden Sie irgendwie haben, um Verweise auf alle diese Zeichenfolgen zu überschreiben und Ihr Gedächtnis als gut.
Das swap Problem ist nicht python-spezifisch ofc, aber hier ist eine Diskussion über diesen Teil: security.stackexchange.com/questions/29350/...
Siehe: pypi.org/project/SecureBytes
InformationsquelleAutor Miles
Gibt es eigentlich -ist - eine Methode zum sicheren löschen von strings in Python; verwenden Sie die memset C-Funktion, die als pro Markieren Sie die Daten, die als sensibel in python
Bearbeitet, um hinzufügen, lange nach dem der post gemacht wurde: hier ist ein tiefer Tauchgang in einer string-Praktikum. Es gibt einige Situationen (vor allem mit nicht-Konstanten strings), wo Sie Ihr Praktikum nicht geschehen, so dass die Bereinigung der string-Wert etwas deutlicher, basierend auf CPython reference counting GC. (Wenn auch noch nicht "schrubben" /"bereinigen" cleanup.)
Es ist auch sehr abhängig vom internen interpreter details wie: id mit dem gleichen Wert wie das Objekt, Zeiger, offset string-Daten aus dem Objekt-Zeiger, etc. Unglaublich spröde; nicht zu empfehlen.
Natürlich ist es das. Dies mag zwar Abstrakt als "spröde", und sicherlich niemand ist es zu empfehlen, es hat eine Antwort auf die Frage "ist das möglich" besser als die die derzeit akzeptierte Antwort Beginn mit "Python nicht haben, dass niedrige einer Ebene der Kontrolle über den Speicher. Akzeptieren Sie es, und verschieben Sie auf." das ist absolut falsch und wenig hilfreich, wie sofort bewiesen durch die Existenz von
ctypes
. Diese Lösung ist eigentlich noch schlimmer, als Sie möglicherweise darauf hindeutet; Sie würden modifizieren Hash-Daten-Werte in der gesamten Anwendung und die Zerstörung der Fähigkeit zur Darstellung bestimmter Zeichenfolgen.Ich finde die Argumentation dieser Antworten: "ist es möglich" besser als die akzeptierte Antwort ziemlich albern. Wie Sie erwähnen, es ist völlig bricht der interpreter; und außerdem, es funktioniert nicht mit anderen regulären Python-string-Funktionen oder Bibliotheken, die Kopien oder temporäre Werte. Und es beruht auf etwas, das mit noch schwächeren Typ Sicherheits - / Warnhinweise / Fehler als normale C., So sind Sie besser dran, nur mit C in den ersten Platz. Ich würde nicht charakterisieren, als "möglich, in Python." Ich bin auch nicht glücklich darüber, dass die erste Antwort richtig ist, aber leider ist es.
Siehe: pypi.org/project/SecureBytes
InformationsquelleAutor amcgregor
Wenn Sie brauchen nicht die E-mail-Objekt zu bestehen, sobald Sie fertig sind, ich denke, Ihre beste Wette ist, führen Sie die mailing-Arbeit in einem Teilprozess (siehe Teilprozess Modul.) So, wenn der Unterprozess stirbt, so geht Ihr Kennwort ein.
InformationsquelleAutor zdan
Dies könnte getan werden, mit numpy chararray:
Würden Sie haben, um zu bestimmen, die maximale Größe von Passwort, aber dies sollte entfernen Sie die Daten, wenn es überschrieben wird.
InformationsquelleAutor heplat
Die richtige Lösung ist die Verwendung eines bytearray() ... was ist veränderbar, und Sie können sicher löschen von Schlüsseln und sensiblen Daten aus dem RAM.
Allerdings gibt es einige Bibliotheken, vor allem die python "Kryptographie" - Bibliothek, die verhindern, dass "bytearray" verwendet werden. Dies ist problematisch... zum Teil diese kryptografischen Bibliotheken sollten sicherstellen, dass nur veränderliche Arten verwendet werden, für wichtige Materialien.
Es ist SecureString-was ist ein pip-Modul, das Ihnen erlaubt, um vollständig zu entfernen Sie einen Schlüssel aus dem Speicher...(ich überarbeitete es ein wenig und nannte es SecureBytes). Ich schrieb einige unit-tests, die zeigen, dass der Schlüssel ist, vollständig entfernt.
Aber es gibt einen großen Nachteil: wenn jemand das Passwort ist "Art", dann das Wort "Typ" wird gewischt bekommen von allen python... auch im Funktions-Definitionen und Objekt-Attribute.
In anderen Worten... mutiert unveränderlichen Typen ist eine schreckliche Idee, und es sei denn, du bist extrem vorsichtig, sofort Absturz jedes Programm läuft.
Die richtige Lösung... nie verwenden unveränderliche Typen für Schlüssel material, Passwörter, etc. Jeder Aufbau einer kryptografischen Bibliothek oder routine wie "getpass" sollte arbeiten mit einer "bytearray" anstelle von python-strings.
InformationsquelleAutor Erik Aronesty
Speichern das Passwort in einer Liste, und wenn Sie nur auf die Liste auf null, ist der Speicher des Arrays gespeichert, die in der Liste automatisch freigegeben.
Auch gibt es keine Spezifikation, um den Speicher zu löschen, nachdem er befreit. Die Erinnerung wird bleiben intakt und werden anfällig für gesicherte oder auf die Festplatte ausgelagert Laufe der Zeit.
Es ist ein schöner Artikel darüber, warum dies nicht funktioniert: effbot.org/pyfaq/...
InformationsquelleAutor AlbertoPL
EDIT: entfernt die schlechte Beratung...
Können Sie auch arrays verwenden wie das java-Beispiel, wenn Sie möchten, aber einfach überschreiben sollte es genug sein.
http://docs.python.org/library/array.html
Ich sehe. Danke für die info.
InformationsquelleAutor Trey Stout