2016-05-26 21 views
-1

Ich schreibe ein Java-Programm zum Spaß, die vertrauliche Informationen von Benutzern speichert.ByteBuffer allocate direct Beispiel

Aus diesem Grund möchte ich sicherstellen, dass die Müllsammlung es nicht berührt, so dass ich in der Zukunft, wenn ich fertig bin, kann ich es aus dem Speicher löschen.

Bisher habe ich diese Codezeile 2048 Bytes erstellen, die mehr als genug ist, um die Passwörter eines Benutzers zu speichern.

Meine Frage ist, wie ich eine Zeichenfolge wie "Secret123" speichern, und nach dem Löschen? Dies ist eine sehr grundlegende Frage, die ich kenne, aber ich konnte sie in der Dokumentation nicht sehen. Ich mache es wahrscheinlich schwieriger als in meinem Kopf, aber Vorsicht ist besser als Nachsicht.

ByteBuffer pass = ByteBuffer.allocateDirect(2048); 

ich von anderen Risiken bewusst bin, wie Swap-Seite Dateien, griff der Computer seines Kaltstart etc ...

Dank!

EDIT: Als Antwort auf die erste Antwort - ich meine, um Speicher mit '0' Zeichen danach zu füllen, nicht um es zu befreien.

+0

Sie sind Bytes, keine Zeichen. Aber habe ich deine Frage nicht beantwortet? – erickson

+0

@erickson pass.put ((Byte) 0); gibt mir eine Fehlermeldung, dass der Bezeichner erwartet wird. – user5623335

+0

@erickson Wenn ich "pass" eintippe. Ich bekomme keine Liste von Dingen, zum Beispiel normalerweise hätte ich .toString() usw. ... aber ich sehe nichts davon. Identifier erwartet, illegaler Start des Typs, dann wird der Identifier erneut erwartet. – user5623335

Antwort

1

Sie können den zugewiesenen Speicher nicht explizit freigeben, aber Sie können den Puffer löschen und dann Nullen (oder zufällige Bytes) in den Puffer schreiben, wenn Sie fertig sind. Dadurch werden alle Daten gelöscht, die zuvor im Puffer gespeichert wurden, wodurch das Angriffsfenster verkleinert wird.

pass.clear(); 
while (pass.hasRemaining()) 
    pass.put((byte) 0); 
+0

Wenn Sie bereit sind, in Reflexionen und Sonnen-/Oracle-spezifischen Code einzutauchen, können Sie den Speicher freigeben. aber die explizite Einstellung auf 0 ist die beste Lösung aus der Sicherheitsperspektive –

+0

Richtig, es heißt aus einem Grund "unsicher", aber es gibt Arbeit im Gange, einige dieser Funktionen zu standardisieren und zu unterstützen. Ich bin mir nicht sicher, ob die Pufferverwaltung enthalten sein wird. – erickson

0

Als Alternative zum Ansatz der @ Erickson, wenn Sie den Byte-Array selbst und erstellen Sie die ByteBuffer durch Umwickeln zuweisen, dann können Sie das Array mit einem Aufruf an Arrays.fill() löschen.

byte[] byteArray = new byte[2048]; 
ByteBuffer bb = ByteBuffer.wrap(byteArray); 
//... do your thing here 
Arrays.fill(byteArray, (byte)0); 

Solange Sie einen Verweis zu halten entweder die byteArray oder die ByteBuffer, Garbage Collection wird das Byte-Array nicht berühren. Sie können das Array auch später zurückholen, indem Sie ByteBuffer.array() aufrufen und es dann auf Null setzen. (NB: Sie sind nicht garantiert eine tatsächliche Array, wenn Sie dies mit einem ByteBuffer von allocateDirect() erstellt.)

+1

Aufruf 'allocateDirect' macht es sehr unwahrscheinlich, dass es eine erreichbare Unterstützung' byte [] ' –

+0

Ja, ich bin mir dessen bewusst. Ich habe es als eine Alternative vorgeschlagen, wenn die direkte Zuweisung nicht wirklich eine Anforderung wäre. – dcsohl

+0

@dcsohl Ich denke nicht, dass dies richtig ist, da es den Garbage Collector verwendet, im Vergleich zu direkten zuweisen, die von OS behandelt wird, so dass Sie sicher sind, dass es sicher gelöscht wird? – user5623335