[英]How do I securely handle and zero key material buffers on the JVM?
我正在為執行加密操作的JVM(在Clojure中)編寫軟件。 具體地,給定秘密輸入,秘密密鑰,非秘密鹽,非秘密個性化,它使用BLAKE2來導出512位密鑰材料。 然后,它使用Arrays
類中的工具將該Arrays
為兩個256位塊。 ( 來源 )
該操作的實際實現存在於libsodium中,因此它在C中實現。我正在使用cesium來訪問它,這是kalium的包裝器, kalium是一個使用jnr-ffi來調用底層C實現的庫。
由於上面的所有緩沖區都有敏感的密鑰材料,我想確保它從內存中清除。 我不確定如何在JVM上安全地做到這一點(哎呀,我甚至不知道如何在C中安全地做到這一點 )。 鑒於材料是從C const char *
為JVM byte[]
,然后我的一些操作產生新的JVM字節數組,關鍵材料將存在於JVM字節數組中。 這引起了兩個問題:
byte[]
zerofill,之后沒有被任何代碼觸及,我怎么能確定byte[]
實際上是否被清零了? 我假設JVM可以自由地優化它。 byte[]
被清零,我怎么知道JVM沒有決定復制該數組(例如在垃圾收集器的上下文中)很多次都沒有將原始位置歸零,因此無論如何,將密鑰材料留在虛擬內存中? 我猜測答案將最終成為“在C&ASM中做到”或甚至“在HSM中做”,但我很想知道是否有JVM-land方法來解決這個問題。
如果只需要清理一個數組,Arrays.fill就不會分配一個新數組,而是更改作為參數傳遞的值。 如果您下載源代碼,可以直接在那里閱讀。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.