Sto recuperando una chiave unencrypted
da un MemoryStream
, convertendola in una sorta di stringa e utilizzando quella stringa con le funzioni di .Net crypto
per crittografare i dati. Devo assicurarmi che la chiave unencrypted
venga cancellata dalla memoria dopo averla utilizzata. Ho trovato SecureString
, che penso si prenderà cura della stringa, ma non sono sicuro di come cancellare la memoria della chiave prima che diventi un SecureString
.MemoryStream a SecureString: cancellazione della memoria
Quindi il modo tutto funziona è:
MemoryStream -> char [] -> SecureString
SecureString
si passa il puntatore alla matrice char, quindi asciuga l'array di caratteri quando si è finito? Questo è di costruttore:
SecureString(Char*,int32)
C'è un esempio attuazione here.
Tuttavia, una volta che il SecureString
salviette i dati (se si asciuga i dati), ho ancora bisogno di sapere come pulire i dati nella MemoryStream
, ed eventuali oggetti intermedi devo creare al fine di ottenere il char[]
.
Quindi questa domanda si riduce a due parti:
Come si fa a leggere un MemoryStream
dritto in un char[]
senza produrre niente altro nella memoria? (E se questo non è possibile, qual è il passaggio ideale? Cioè, MemoryStream -> string -> char[]
?)
e,
Come si fa a sovrascrivere la memoria utilizzata dal MemoryStream
(e qualsiasi altro firme create nel processo MemStream->char[]
) Al termine?
Cosa intendi con _ senza produrre altro nella memoria_? Quando leggi il tuo stream, la tua chiave è _already_ in memoria - presumibilmente non criptata. Puoi leggerlo in un 'char []' locale e passare a 'SecureString'. Sovrascrivi ed elimina l'array una volta terminato. Non è questo quello che stai cercando? – xxbbcc
[domanda modificata per spiegare questo] Sì, stavo pensando anche a questo. Stavo cercando di evitare di sovrascrivere nulla in memoria manualmente (perché non ho idea di come farlo). Quindi, se ho lo stream di memoria, lo leggo in un char [], uso una stringa sicura (che cancella il char array, giusto?), Quindi ho bisogno di cancellare la memoria da memoryStream ... giusto? Come potrei farlo? Qualcos'altro è stato creato? – bordeo
La risposta breve è che non puoi. Non appena hai i dati in una normale stringa gestita, hai già perso, e non c'è un modo reale affidabile per sbarazzartene. – Servy