代码之家  ›  专栏  ›  技术社区  ›  Jeremy Powell

如何确保Java对象(包含加密材料)归零?

  •  5
  • Jeremy Powell  · 技术社区  · 15 年前

    作为可能的解决方案,是否足以:

    public class Key {
      private char[] key;
      // ...
      protected void finalize() throws Throwable { 
        try {
          for(int k = 0; k < key.length; k++) {
            key[k] = '\0';
          }
        } catch (Exception e) {
          //...
        } finally {
          super.finalize();
        }
      }
      // ...
    }
    

    编辑:请注意,我的问题不仅仅是关于对象的正式(引用的)副本的归零,还包括垃圾收集器为空间和速度效率而洗牌内存时可能产生的任何过时副本。

    找到那把钥匙。

    4 回复  |  直到 15 年前
        1
  •  4
  •   Mark Byers    15 年前

    这个 Java Cryptography Extension Reference Guide 建议始终使用字符数组而不是字符串作为密码,以便以后可以将其归零。它们还提供了一个 how you could implement it

        2
  •  1
  •   Tom Hawtin - tackline    15 年前

    你最好用 allocateDirect 在NIO。在一个理智的实现中,这一点不应该被改变。但它可能有资格分页到磁盘(我猜你可以轮询它)和休眠。

        3
  •  1
  •   Michael Borgwardt    15 年前

    如果内存中的数据在特定时间没有被覆盖?如果你不得不担心攻击者读取你机器的内存, 问题不是他什么时候能找到什么。

    什么 实际的

    如果您担心作为系统上的普通用户运行的攻击者获得JVM丢弃的内存:AFAIK所有现代操作系统都用零覆盖新分配的内存。

        4
  •  0
  •   Jeremy Powell    15 年前

    所以我从@jambjo和@james那里得出结论,我真的没有什么办法来防止钥匙被复制和下落不明。

    如果其他人能提出更好的解决方案,我会非常愿意接受他们的回答。