Irretrievably destroying data in Java

后端 未结 10 1342
时光说笑
时光说笑 2020-12-10 04:26

Is there anyway in Java to delete data (e.g., a variable value, object) and be sure it can\'t be recovered from memory? Does assigning null to a variable in Jav

相关标签:
10条回答
  • 2020-12-10 05:14

    Store sensitive data in an array, then "zero" it out as soon as possible.

    Any data in RAM can be copied to the disk by a virtual memory system. Data in RAM (or a core dump) can also be inspected by debugging tools. To minimize the chance of this happening, you should strive for the following

    • keep the time window a secret is present in memory as short as possible
    • be careful about IO pipelines (e.g., BufferedInputStream) that internally buffer data
    • keep the references to the secret on the stack and out of the heap
    • don't use immutable types, like String, to hold secrets

    The cryptographic APIs in Java use this approach, and any APIs you create should support it too. For example, KeyStore.load allows a caller to clear a password char[], and when the call completes, as does the KeySpec for password-based encryption.

    Ideally, you would use a finally block to zero the array, like this:

    KeyStore ks = KeyStore.getInstance(KeyStore.getDefaultType());
    InputStream is = …
    char[] pw = System.console().readPassword();
    try {
     ks.load(is, pw);
    }
    finally {
      Arrays.fill(pw, '\0');
    }
    
    0 讨论(0)
  • 2020-12-10 05:15

    If you're thinking about securing password/key management, you could write some JNI code that uses platform-specific API to store the keys in a secure way and not leak the data into the memory managed by the JVM. For example, you could store the keys in a page locked in physical memory and could prevent the IO bus from accessing the memory.

    EDIT: To comment on some of the previous answers, the JVM could relocate your objects in memory without erasing their previous locations, so, even char[], bytes, ints and other "erasable" data types aren't an answer if you really want to make sure that no sensitive information is stored in the memory managed by the JVM or swapped on to the hard drive.

    0 讨论(0)
  • 2020-12-10 05:20

    Nope, unless you have direct answer to hardware. There is a chance that variable will be cached somewhere. Sensitive data can even be stored in swap :) If you're concerning only about RAM, you can play with garbage collector. In high level langs usually you don't have a direct access to memory, so it's not possible to control this aspect. For example in .NET there is a class SecureString which uses interop and direct memory access.

    0 讨论(0)
  • 2020-12-10 05:23

    Nothing gets deleted, its just about being accessible or not to the application. Once inaccessible, the space becomes a candidate for subsequent usage when need arises and the space will be overwritten. In case of direct memory access, something is always there to read but it might be junk and wont make sense.

    0 讨论(0)
提交回复
热议问题