猿问

使用 crypto/* 后安全地将缓冲区清零

有没有办法将包含 e 的缓冲区归零?G。使用私钥后确保编译器不会删除未使用的归零代码?有件事告诉我一个简单的事情:

copy(privateKey, make([]byte, keySize))

不保证留在那里。


慕后森
浏览 115回答 2
2回答

梵蒂冈之花

听起来您想防止敏感数据保留在内存中。但是您是否考虑过数据可能已被复制或交换到磁盘?

白板的微信

在将缓冲区清零并将其传递给另一个函数后检查(部分)缓冲区内容怎么样?例如:copy(privateKey, make([]byte, keySize))if privateKey[0] != 0 {    // If you pass the buffer to another function,    // this check and above copy() can't be optimized away:    fmt.Println("Zeroing failed", privateKey[0])}为了绝对安全,您可以将传递的缓冲区内容与随机字节进行异或,但如果/由于归零未优化,则if永远不会到达主体。您可能认为一个非常智能的编译器可能会推断出上述copy()零privateKey[0],从而确定条件始终为假,并且仍然将其优化掉(尽管这不太可能)。解决这个问题的方法不是使用make([]byte, keySize)来自全局变量或函数参数的切片(其值只能在运行时确定),因此编译器不能足够聪明地推断条件将始终为假在编译时。
随时随地看视频慕课网APP

相关分类

Go
我要回答