Перезаписать закрытый ключ в Go

# #go #private-key #public-key

Вопрос:

В коде Go на стороне сервера я получаю закрытые ключи и использую их для подписи утверждений, но я не хочу оставлять их в памяти. Вменяемо ли следующее?

     var private ed25519.PrivateKey

    // acquire and use the private key

    // now I want to overwrite it so it's not lurking in memory
    privKeyBytes := []byte(private)
    _, _ = rand.Read(privKeyBytes)
 

Ответ №1:

Да, перезапись ключевых байтов должна делать это в большинстве случаев.

Обратите внимание, что в настоящее время сборщик мусора Go CMS является неподвижным сборщиком мусора поколения, что означает, что если вы не создадите копию объекта, то GC также не будет создавать копии. Это деталь реализации и может измениться в будущем.

Кроме того, // acquire and use the private key часть, в зависимости от того, что она делает, также может привести к утечке ключа в кучу. Например, чтение файла в формате PEM, вероятно, приведет к утечке строки, закодированной в PEM.

Чтобы действительно знать наверняка, взломайте gdb сразу после перезаписи ключа и сбросьте всю кучу в файл. Затем найдите в нем ключевые байты.

 $ go build -gcflags "-N -l"
$ gdb ./test
(gdb) source /usr/go/src/runtime/runtime-gdb.py
Loading Go Runtime support.
(gdb) b test.go:16
(gdb) r
Thread 1 "test" hit Breakpoint 1, main.main () at test/test.go:16
(gdb) info i
  Num  Description       Executable
* 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..." heap.bin
$ fg
(gdb) q