it-swarm-eu.dev

Odstranění objektu Java Object bezpečně)

Vím, že pro smazání objektu Java Java) bych měl použít řetězec znaků namísto řetězce, protože mohu bezpečně vymazat (přepsat pole znaků jinými daty) jeho obsah. Zdá se, že to není proveditelné pro objekty String.

Nyní na BlackBerry, který je založen na Java, jsem nebyl schopen najít API pro zpracování dat jako znakové pole, ale jsem povinen použít String. Takže moje otázka, v případě, že si uložím heslo v objekt, jak jej mohu bezpečně odstranit?

33
smiley

Ve skutečnosti vy nemůžete skutečně „bezpečně vymazat“ řadu znaků v Javě. Java provádí přidělení paměti prostřednictvím sběratele odpad , složitého softwaru, který v praxi bude pohybovat paměťovými objekty fyzicky RAM = pravidelně. Takže to, co si myslíte, že jako „char[] instance“ bude zkopírováno na několika místech a vymazání se fyzicky stane pouze na jednom z těchto míst.

V tomto kontextu nemůže „bezpečné odstranění“ v Javě skutečně existovat. Používáte-li Javu, musíte zajistit, že kontext použití je takový, že bezpečné odstranění není nutné: „bezpečné odstranění“ je potřeba většinou, když operační systém může alokovat nenulové bloky RAM= bloky (tedy aplikace) může získat výňatky starých RAM z jiných aplikací), nebo v přítomnosti virtuální paměti (části RAM jsou zkopírovány na pevný disk). I hádejte, že se nevztahují na BlackBerry, takže jednoduché případy String by měly být v pořádku.

Dalším způsobem, jak to vyjádřit, je to, že pokud instance String nejsou v pořádku pro hesla, pak máte větší bezpečnostní problémy než pouhý únik hesla . Koneckonců, používáte heslo k ochraně přístupu k některým datům, takže pokud potřebujete heslo „bezpečné mazání“, pak logicky byste také potřebovali „bezpečné mazání“ chráněných dat a všeho, co děláte s tím.

(Dá se hádat, že nejsem velkým fanouškem pojmu „bezpečné mazání“.)

43
Thomas Pornin

v případě, že si do objektu uložím heslo, jak je mohu bezpečně vymazat?

Myslím, že myslíš; jak můžete zabránit útočníkovi s přístupem k zařízení v obnovení hesla?

Záleží na tom, jakou úroveň přístupu útočník získal.

Pokud je útočník omezen na externí API, které poskytujete (není to dobrý předpoklad), pak by mělo stačit řízení přístupu pomocí Java.security.AccessController. Pokud správně nastavíte řízení přístupu (velmi obtížně proveditelné) a útočník nemůže obejít řízení přístupu, řízení přístupu zabrání útočníkovi získat data.

Pokud je útočník omezen na provoz v rámci virtuálního počítače Java, ale nikoli vašeho API), musíte data chránit pomocí KeyStore.PrivateKeyEntry. Na této úrovni se nemůžete spolehnout na správnou funkci svůj návrh na ochranu dat a pro zajištění ochrany se musíte spolehnout na virtuální stroj Java).

Pokud je útočník omezen na operační systém (nikoli na virtuální stroj Java virtuální stroj), nemůžete chránit svá data. Pokud útočník může zabránit virtuálnímu Java Virtual) pokud stroj pracuje tak, jak byl navržen, může útočník obejít jakýkoli bezpečnostní mechanismus Java).

Pokud má útočník fyzický přístup k zařízení, není možné chránit data před všemi útoky. Na této úrovni může útočník číst data při zápisu do paměti RAM, flash, hardwarových modulů atd.

6
this.josh