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

Security Golang加密接口和易失性存储器,security,go,cryptography,Security,Go,Cryptography,如何安全地管理存储在接口中/接口后面的加密机密 我的问题如下: 我有一个长期运行的应用程序,它使用cipher.AEAD接口的实现进行加密。 获取接口实例(chacha20poly1305)的唯一方法是通过以下方法: func New([]字节)(cipher.AEAD,错误) 我创建并使用该实例一段时间,然后“删除”该实例,并希望确保以后无法恢复密钥。 出于这个原因,我希望避免将密钥材料交换到磁盘 使用反射和不安全,我可以: 获取基本内存的大小和指针 Do mlock(避免内容被交换到磁盘)

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

我的问题如下:

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

func New([]字节)(cipher.AEAD,错误)

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

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

  • 获取基本内存的大小和指针
  • Do mlock(避免内容被交换到磁盘)
  • 使用实例
  • 进行“记忆设置”(移除关键材料)
  • 使用芒锁
  • 但是有一个问题,实例可能会被分配到整个堆中。 假设我需要的不止是“ulimit-l”,我可能会用完,即使每个实例只有32字节

    有办法解决这个问题吗?理想情况下,这是一种只分配这些结构的较小“安全mlocked堆”的方法。
    或者,通过某种方式将内存(比如分配使用)强制转换到接口的特定实现(未公开)中,然后手动设置结构(而不是使用新的([]字节)->cipher.AEAD)

    有什么理由不使用它将整个进程的内存锁定在RAM中吗?该程序太大,无法容纳大多数系统上的“ulimit-l”页面(我的系统atm上的64 x 4096字节)有没有理由不将整个进程的内存锁定在RAM中?该程序太大,无法容纳大多数系统上的“ulimit-l”页面(我的系统atm上的64 x 4096字节)