为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
慕后森 2023-08-07 10:48:37
有没有办法将包含 e 的缓冲区归零?G。使用私钥后确保编译器不会删除未使用的归零代码?有件事告诉我一个简单的事情:copy(privateKey, make([]byte, keySize))不保证留在那里。
查看完整描述

2 回答

?
梵蒂冈之花

TA贡献1900条经验 获得超5个赞

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

查看完整回答
反对 回复 2023-08-07
?
白板的微信

TA贡献1883条经验 获得超3个赞

在将缓冲区清零并将其传递给另一个函数后检查(部分)缓冲区内容怎么样?例如:


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)来自全局变量或函数参数的切片(其值只能在运行时确定),因此编译器不能足够聪明地推断条件将始终为假在编译时。


查看完整回答
反对 回复 2023-08-07
  • 2 回答
  • 0 关注
  • 108 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信