2011-03-30 182 views
5

我寫的軟件,在各條敏感信息,如電子郵件地址,密碼和信用卡號碼的交易。敏感數據轉儲

當我們遇到內存的麻煩,它會是不錯的應用程序寫一個堆轉儲。問題是如果線程恰好在該區域工作,堆轉儲可能包含明文形式的敏感信息......當我們在其他地方進行加密時,我們並不真的希望將這些信息寫入磁盤。

與此處理等作爲導致JVM寫加密的垃圾場存在意味着什麼?

+0

哇,ID有興趣,看看是否有一個解決方案 - 這是昂貴的,瘸腿的,但在你的對象 – somid3 2011-03-30 06:09:39

+1

人瓦特/ root訪問權限可以得到轉儲和/或修改應用程序加密的一切。所以,我不太明白加密任何東西的理由。您可以獲得任何java進程的堆轉儲w/jmap。 – bestsss 2011-03-30 14:37:34

回答

1

簡短的答案是不完全。在某些時候,您必須清楚地使用這些數據才能使用它,並且在垃圾收集的虛擬機中,您無法控制何時從內存中物理刪除對象。減少風險的唯一真正策略是儘快刪除對未加密的機密數據的所有引用。它不能保證沒有機密數據將被寫入內存轉儲,但如果有人可以做到這一點,那麼他們已經可以獲得關鍵信息。

+4

但請確保在未對其進行引用之前先刪除內存區域! (因此,絕對不要在'String'對象中存儲密碼,而是使用'char []'來代替)。 – 2011-03-30 06:13:07

+0

在相關說明中,我需要做過去的事情,比如接受用戶的密碼,然後將它傳遞給WS調用,但JAXB無法使用字節數組傳遞字符串值。有沒有人知道解決方法? – 2011-03-30 06:21:27

+1

@Chris,java中的「nuking」內存不起作用。垃圾收集器隨時可以隨意複製內容,因此您將被留下一個不含內核的對象。你唯一可以做的就是使用DirectCharacterBuffers而不是char [],只需使用一個大緩衝區並對其進行分片,因爲直接緩衝區至少需要一個內存頁。爲了讓事情變得更糟,您必須清除包含套接字緩衝區的所有信息。總的來說,這是毫無價值的努力。 – bestsss 2011-03-30 14:32:05

3

我一直在考慮這個處理外,如果VM。天真的做法可能是讓jvm將轉儲寫入加密的回送設備。當然,這不是完全安全的,因爲任何擁有root權限的人都可以進入掛載點,但這是我期待的那種解決方案。我可能會看到是否可以設置jvm最終寫入的FIFO。我知道虛擬機將使用的文件名,所以這可能取決於虛擬機如何處理(後來:這不起作用.JVM抱怨「文件存在」)

只使用char數組緩解這個問題,但它仍然有可能在轉儲時數組將包含一些純文本。

+0

+1加密循環設備 – Daniel 2011-03-30 12:17:58

+1

我會註冊,你會得到代表到一個帳戶。 – Daniel 2011-03-30 12:18:56

+0

即使您這樣做,數據仍然不會在某個時間點作爲託管堆對象生存。我不確定收益遞減點在哪裏可以降低風險。 – Jeremy 2011-03-30 18:35:18