在服務器端的 Go 代碼中,我獲取了私鑰并使用它們來簽署斷言,但我不想讓它們在記憶體中亂放。 下面的做法合理嗎?
var private ed25519.PrivateKey
//獲得并使用私鑰。
//現在我想把它覆寫掉,這樣它就不會潛伏在記憶體中了。
privKeyBytes :=[]byte(private)
_, _ = rand.Read(privKeyBytes)
uj5u.com熱心網友回復:
是的,在大多數情況下,覆寫密鑰位元組應該可以做到。
注意,目前Go CMS的垃圾收集器是一個非移動生成的GC,也就是說,如果你不對一個物件進行拷貝,那么GC也不會進行拷貝。這只是實施細節,將來可能會發生變化。
此外,//獲取和使用私鑰部分,根據它所做的事情,也可能將密鑰泄露到堆中。例如,讀取一個 PEM 格式的檔案可能會泄露 PEM 編碼的字串。
為了真正確定,在覆寫密鑰后立即進入gdb并將整個堆轉儲到一個檔案。然后在其中搜索關鍵位元組。
$ go build -gcflags "-N -l"
$ gdb ./test
(gdb) source /usr/go/src/runtime/runtime-gdb.py
載入Go Runtime支持。
(gdb) b test.go:16。
(gdb) r
執行緒1 "test"擊中斷點1, main.main () at test/test.go:16
(gdb) 資訊 i
數值 描述 可執行
* 1 process 14176 test/test
(gdb) (Ctrl-Z)
[1] Stopped gdb ./test
$ cat /proc/14176/maps|grep '[heap]'|(read a; x=(${a//-/ })。dd if=/proc/14176/mem bs=4096 iflag=skip_bytes,count_bytes skip=$((0x${x[0]})) count=$((0x${x[1]}-0x${x[0]})of=heap. bin)
$ grep -obUaP "x01x02x03..."/span> heap.bin
$ fg
(gdb) q
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/329374.html
標籤:
