簡體   English   中英

如何在JVM上安全地處理和清零密鑰材料緩沖區?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM