# sicheres löschen von Variablen



## LStrike (10. Jul 2010)

Moin moin,

wie kann ich Variablen eigentlich sicher löschen?

Ich befasse mich nach wie vor mit Kryptographie und habe nun folgendes "Problem".
In meiner kleinen Anwendung speichere ich unter anderem einen AES-Schlüssel als Bytearray und einen öffentlichen RSA-Schlüssel als PublicKey zwischen.

Ein Array kann ich mit (in rawKey ist der AES-Schlüssel gespeichert):

```
private void deleteKeys(){
		byte b = 0;
		Arrays.fill(rawKey, b);
	}
```
löschen. Das sollte eigentlich sicher gelöscht sein.
Doch wie mache ich das mit dem RSA-Schlüssel. Oder reicht es etwa die Variable = null zusetzen?

Gruß LStrike


----------



## Wildcard (10. Jul 2010)

null setzen reicht nicht wenn du sichergehen willst, da der Wert solange im Speicher steht bis der GC frei räumt.
Welcher Typ Variable ist der RSA Schlüssel?


----------



## LStrike (10. Jul 2010)

Habe ich mir doch gedacht, dass auf null setzen nicht reicht.

Der Typ vom RSA-Schlüssel ist PublicKey aus java.security.PublicKey.


----------



## Wildcard (10. Jul 2010)

Würde von der konkreten Implementierung abhängen welche Felder dort vorhanden sind.
Aber: warum möchtest du eigentlich den Public Key aus dem Speicher haben? Der ist ja 'Public' und somit unkritisch,


----------



## LStrike (10. Jul 2010)

Hmmm, da hast du wohl recht, eigentlich ist es unnötig den zu löschen.
Habe da wohl nicht weit genug gedacht. 
War halt am vor mich hin prökeln, wo mir der Gedanke kam, Mensch, du musst doch noch den AES-Schlüssel löschen und habe dann nicht weiter gedacht und wollte halt beide Schlüssel sicher löschen.

Danke

Mich würde dennoch interessieren, welche Möglichkeiten es vielleicht allgemein gibt Variablen sicher zu löschen.


----------



## Wildcard (10. Jul 2010)

'Löschen' kann man gar nicht, nur überschreiben. Das funktioniert allerdings nur bei arrays und primitiven und zwar genau wie du oben demonstrierst in dem du einen neuen Wert zuweist. Deshalb werden Passwörter zB in der Regel als char[] übergeben, da es keine Möglichkeit gibt einen String sofort wieder aus dem Speicher zu löschen.


----------



## LStrike (10. Jul 2010)

Alles klar, Vielen Dank.


----------



## Wuella (11. Jul 2010)

Nur eine Idee, aber wie wärs denn mit auf "null" setzen und dann mit 
	
	
	
	





```
System.gc
```
 den Garbage Collector aufrufen?


----------



## jgh (11. Jul 2010)

Der Aufruf von "System.gc()" führt nicht zwangsläufig zum Ausführen des Garbage-Collectors. 
Es ist nur ein Hinweis, das bei der nächsten Möglichkeit der GC ausgeführt werden soll.


----------



## tuttle64 (11. Jul 2010)

jgh hat gesagt.:


> Der Aufruf von "System.gc()" führt nicht zwangsläufig zum Ausführen des Garbage-Collectors.
> Es ist nur ein Hinweis, das bei der nächsten Möglichkeit der GC ausgeführt werden soll.




zudem werden "nur" objekte im heap gelöscht, die keine objektreferenzen im stack besitzen.


----------

