Golang加密接口和易失性存储器

时间:2017-08-19 21:29:14

标签: security go cryptography

如何安全地管理存储在/后面的加密机密?

我的问题如下:

我有一个运行时间很长的应用程序,它使用cipher.AEAD接口的实现进行加密。 获取接口实例(chacha20poly1305)的唯一方法是使用方法:

func New([] byte)(cipher.AEAD,error)

我创建并使用该实例一段时间,然后“删除”该实例并希望确保以后无法恢复该密钥。 出于这个原因,我想避免将密钥材料交换到磁盘。

使用反射和不安全,我可以:

  1. 获取大小和指向底层内存的指针
  2. 执行mlock(以避免将内容交换到磁盘)
  3. 使用实例
  4. 执行“memset”(删除密钥材料)
  5. 使用munlock
  6. 但是有一个问题,实例可能在整个堆中分配。 假设我需要的不仅仅是“ulimit -l”,我可能会用完,即使每个实例只有32个字节。

    有什么方法可以解决这个问题吗?理想情况下,一种方法是使用较小的“安全mlocked堆”,只分配这些结构。 或者某种方式将内存(比如使用https://github.com/awnumar/memguard分配)转换为接口的特定实现(未公开),然后手动设置结构(而不​​是使用New([] byte) - > cipher.AEAD)

0 个答案:

没有答案