2009-06-11 18 views
19

Ho bisogno di memorizzare la password di un utente per un breve periodo di tempo in memoria. Come posso farlo, ma non ho queste informazioni accidentalmente rivelate in coredumps o tracebacks? C'è un modo per contrassegnare un valore come "sensibile", quindi non viene salvato da nessun punto da un debugger?Segna i dati come sensibili in python

+0

Vedere anche questa domanda: http://stackoverflow.com/questions/728164/securely-erasing-password-in-memory-python – Miles

risposta

30

Modifica

Ho fatto una soluzione che utilizza ctypes (che a sua volta utilizza C) alla memoria zero.

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) 

Non sono in grado di garantire la sicurezza di questo codice. È testato per funzionare su x86 e CPython 2.6.2. Un writeup più lungo è here.

Decrittografare e crittografare in Python non funzionerà. Stringhe e interi sono internati e persistenti, il che significa che stai lasciando un pasticcio di informazioni sulla password ovunque.

Hashing è la risposta standard, anche se ovviamente il testo in chiaro deve essere elaborato da qualche parte.

La soluzione corretta è eseguire i processi sensibili come un modulo C.

Ma se la tua memoria viene costantemente compromessa, ripenserò la tua configurazione di sicurezza.

+2

Questo è giusto. Se tu/mai/leggi la password in un oggetto Python, c'è il rischio che venga compromessa da un dump. Anche l'uso di C non è perfetto (puoi comunque bloccare il programma e usare un debugger a livello di kernel), ma dovrebbe essere abbastanza buono. –

+0

L'annullo è morto. :( – Barry

+0

Se questo è lo stesso 'memset' come menzionato nel seguente articolo, anche questo non è sicuro http://www.viva64.com/en/b/0178/ o https://www.owasp.org /index.php/Insecure_Compiler_Optimization – Danny

2

Non c'è modo di "marchio come sensibili", ma si potrebbe criptare i dati in memoria e decifrare di nuovo quando è necessario utilizzare esso - non è una soluzione perfetta, ma il meglio che posso pensare.

2
  • XOR con un one-time pad memorizzato separatamente
  • Conservare sempre hash salato piuttosto che password stessa

o, se siete molto paranoico circa discariche, archivio chiavi casuale univoco in qualche altro posto, ad es Ho un thread diverso, in un registro, sul server, ecc

4

... L'unica soluzione a questo è utilizzare strutture dati mutabili. Questo è, è necessario utilizzare solo strutture di dati che consentono di dinamicamente sostituire elementi. Ad esempio, in Python è possibile utilizzare gli elenchi per memorizzare una matrice di caratteri . Tuttavia, ogni volta che aggiungi o rimuovi un elemento da un elenco, la lingua potrebbe copiare l'intero elenco dietro la schiena, a seconda dei dettagli dell'implementazione. Per sicurezza, se è necessario ridimensionare dinamicamente una struttura dati, , è necessario crearne uno nuovo, copiare i dati e quindi scrivere su quello vecchio. Per esempio:

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 

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

  • Autore: John Viega ([email protected]) è co-autore di edificio sicuro Software (Addison-Wesley, 2001) e Java Enterprise Architecture (O'Reilly and Associates, 2001).John è autore di oltre 50 pubblicazioni tecniche , principalmente nel campo della sicurezza del software. Ha anche scritto Mailman, GNU Mailing List Manager e ITS4, uno strumento per trovare vulnerabilità di sicurezza in codice C e C++.
+0

Come variante: usare questa tecnica per popolare un [bytearray] (https : //docs.python.org/3.1/library/functions.html#bytearray) restituisce un oggetto che può essere utilizzato al posto di un'istanza 'bytes' in un sacco di codice Python ... e può essere cancellato in modo equivalente in seguito. –

Problemi correlati