it-swarm-eu.dev

Löschen eines Java Objekts sicher

Ich weiß, dass ich zum Löschen eines Java Objekts) ein Zeichenarray anstelle von String verwenden sollte, da ich dessen Inhalt sicher löschen (das Zeichenarray mit anderen Daten umschreiben) kann. Dies scheint nicht der Fall zu sein machbar für die String-Objekte.

Jetzt auf BlackBerry, das Java basiert), konnte ich keine API finden, um Daten als Zeichenarray zu verarbeiten, aber ich bin verpflichtet, String zu verwenden. Daher meine Frage, falls ich ein Passwort in speichere ein Objekt, wie kann ich es sicher löschen?

33
smiley

Tatsächlich können Sie ein Array von Zeichen in Java nicht wirklich "sicher löschen". Java führt die Speicherzuweisung über einen Garbage Collector durch, eine knifflige Software, die in der Praxis Speicherobjekte in physischen RAM) verschiebt = regelmäßig. Also, was Sie als "a char[] instance "wird an mehreren Stellen kopiert, und das Löschen erfolgt physisch nur an einer dieser Stellen.

In diesem Zusammenhang kann "sicheres Löschen" in Java nicht wirklich existieren. Wenn Sie Java verwenden, müssen Sie sicherstellen, dass der Verwendungskontext so ist, dass ein sicheres Löschen nicht erforderlich ist: "Sicheres Löschen" ist meistens erforderlich, wenn das Betriebssystem möglicherweise nicht nullisierte RAM -Blöcke (also eine Anwendung) zuweist Möglicherweise erhalten Sie Auszüge aus alten RAM aus anderen Anwendungen) oder in Gegenwart von virtuellem Speicher (Teile des RAM wird auf eine Festplatte kopiert). I. Vermutlich gelten diese nicht für ein BlackBerry, daher sollten einfache String Instanzen in Ordnung sein.

Eine andere Möglichkeit, dies festzustellen, besteht darin, dass Sie größere Sicherheitsprobleme haben als nur einen Passwortverlust, wenn die Instanz String für Passwörter nicht in Ordnung ist . Schließlich verwenden Sie ein Kennwort, um den Zugriff auf einige Daten zu schützen. Wenn Sie also ein Kennwort "sicher löschen" müssen, müssen Sie logischerweise auch die geschützten Daten und alles, was Sie tun, "sicher löschen" damit.

(Man kann sich vorstellen, dass ich kein großer Fan des Konzepts des "sicheren Löschens" bin.)

43
Thomas Pornin

wie kann ich ein Passwort sicher löschen, wenn ich es in einem Objekt speichere?

Ich denke du meinst; Wie können Sie verhindern, dass ein Angreifer mit Zugriff auf das Gerät das Kennwort wiederherstellt?

Dies hängt davon ab, welche Zugriffsebene der Angreifer erhalten hat.

Wenn der Angreifer auf die von Ihnen bereitgestellte externe API beschränkt ist (keine gute Annahme), sollte die Zugriffssteuerung mit Java.security.AccessController ausreichen. Wenn Sie Ihre Zugriffskontrollen korrekt gestalten (sehr schwierig) und der Angreifer die Zugriffskontrollen nicht umgehen kann, verhindert die Zugriffskontrolle, dass der Angreifer die Daten erhält.

Wenn der Angreifer nur innerhalb der virtuellen Maschine Java arbeiten darf, jedoch nicht in Ihrer API, müssen Sie die Daten mit KeyStore.PrivateKeyEntry schützen. Auf dieser Ebene können Sie sich nicht auf den ordnungsgemäßen Betrieb Ihres Entwurfs verlassen, um die Daten zu schützen, und Sie müssen sich auf die virtuelle Maschine Java verlassen, um Schutz zu bieten.

Wenn der Angreifer auf das Betriebssystem beschränkt ist (nicht auf die virtuelle Maschine Java), können Sie Ihre Daten nicht schützen. Wenn der Angreifer verhindern kann, dass die virtuelle Maschine Java wie vorgesehen funktioniert, kann der Angreifer jeden Sicherheitsmechanismus Java umgehen.

Wenn der Angreifer physischen Zugriff auf das Gerät hat, können die Daten nicht vor allen Angriffen geschützt werden. Auf dieser Ebene kann der Angreifer Daten lesen, während sie in RAM, Flash, Hardwaremodule usw. geschrieben werden.

6
this.josh