2009-06-11 6 views
19

Ich muss ein Benutzerpasswort für eine kurze Zeit im Speicher speichern. Wie kann ich dies tun, ohne solche Informationen versehentlich in Coredumps oder Tracebacks zu veröffentlichen? Gibt es eine Möglichkeit, einen Wert als "sensibel" zu markieren, sodass er von keinem Debugger gespeichert wird?Markiere Daten in Python als empfindlich

+0

Siehe auch diese Frage: http://stackoverflow.com/questions/728164/securely-erasing-password-in-memory-python – Miles

Antwort

30

bearbeitet

ich eine Lösung gemacht habe, die ctypes (die wiederum verwendet C) auf Null Speicher verwendet.

import sys 
import ctypes 

def zerome(string): 
    location = id(string) + 20 
    size  = sys.getsizeof(string) - 20 

    memset = ctypes.cdll.msvcrt.memset 
    # For Linux, use the following. Change the 6 to whatever it is on your computer. 
    # memset = ctypes.CDLL("libc.so.6").memset 

    print "Clearing 0x%08x size %i bytes" % (location, size) 

    memset(location, 0, size) 

Ich mache keine Garantien für die Sicherheit dieses Codes. Es wurde getestet, um auf x86 und CPython 2.6.2 zu arbeiten. Eine längere Beschreibung ist here.

Das Entschlüsseln und Verschlüsseln in Python funktioniert nicht. Strings und Integer sind interniert und persistent, was bedeutet, dass Sie überall ein Durcheinander von Passwortinformationen hinterlassen.

Hashing ist die Standardantwort, obwohl der Klartext irgendwann irgendwo bearbeitet werden muss.

Die richtige Lösung ist, die sensiblen Prozesse als C-Modul zu machen.

Aber wenn Ihr Speicher ständig kompromittiert wird, würde ich Ihre Sicherheitseinstellungen überdenken.

+2

Dies ist richtig. Wenn Sie das Kennwort in ein Python-Objekt einlesen, besteht die Gefahr, dass es durch einen Speicherauszug kompromittiert wird. Sogar die Verwendung von C ist nicht perfekt (Sie können das Programm immer noch einfrieren und einen Debugger auf Kernel-Ebene verwenden), aber es sollte gut genug sein. –

+0

Die Beschreibung ist tot. :( – Barry

+0

Wenn dies die gleiche "memset" ist, wie in dem folgenden Artikel erwähnt, ist dies auch unsicher. Http://www.viva64.com/en/b/0178/ oder https://www.owasp.org /index.php/Insecure_Compiler_Optimization – Danny

2

Keine Möglichkeit, "als empfindlich zu markieren", aber Sie könnten die Daten im Speicher verschlüsseln und sie wieder entschlüsseln, wenn Sie sie brauchen - keine perfekte Lösung, aber die beste, die ich mir vorstellen kann.

2
  • XOR mit einem Einmal-Pad separat gespeichert
  • immer gesalzene Hash speichern, statt Passwort selbst

oder, wenn Sie über Deponien sehr paranoid sind, speichern Sie einzigartige Zufallsschlüssel in einem anderen Ort, z i ein anderer Thread, in einem Register, auf dem Server, usw.

4

... Die einzige Lösung hierfür ist die Verwendung veränderbarer Datenstrukturen. Das ist, müssen Sie nur Datenstrukturen verwenden, die Sie dynamisch ersetzen können Elemente ersetzen. In Python können Sie beispielsweise Listen verwenden, um ein Zeichenfeld zu speichern. Jedoch jedes Mal, wenn Sie ein Element aus einer Liste hinzufügen oder entfernen, kopiert die Sprache möglicherweise die gesamte Liste hinter Ihrem Rücken, abhängig von den Implementierungsdetails. Um sicher zu sein, wenn Sie dynamisch Größe einer Datenstruktur ändern, sollten Sie eine neue erstellen, kopieren Sie Daten, und schreiben Sie dann über die alte. Zum Beispiel:

def paranoid_add_character_to_list(ch, l): 
    """Copy l, adding a new character, ch. Erase l. Return the result.""" 
    new_list = [] 
    for i in range(len(l)): 
    new_list.append(0) 
    new_list.append(ch) 
    for i in range(len(l)): 
    new_list[i] = l[i] 
    l[i] = 0 
    return new_list 

Quelle: http://www.ibm.com/developerworks/library/s-data.html

  • Autor: John Viega ([email protected]) ist Co-Autor von Erstellen sichere Software (Addison-Wesley, 2001) und Java Enterprise Architecture (O'Reilly and Associates, 2001).John hat mehr als 50 technische Publikationen verfasst, hauptsächlich im Bereich der Software-Sicherheit. Er schrieb auch Mailman, den GNU Mailing List Manager und ITS4, ein Tool zum Auffinden von Sicherheitslücken in C- und C++ - Code.
+0

Als eine Variante: Verwenden dieser Technik zum Auffüllen eines [Bytearrays] (https : //docs.python.org/3.1/library/functions.html#bytearray) führt zu einem Objekt, das anstelle einer bytes-Instanz verwendet werden kann in viel Python-Code ... und kann danach äquivalent gelöscht werden. –

Verwandte Themen