>

어쨌든 Java에서 데이터 (예 : 변수 값, 객체)를 삭제하고 메모리에서 복구 할 수 없도록해야합니까? null 를 할당합니다  Java의 변수에 메모리에서 값을 삭제 하시겠습니까? 어떤 아이디어? 다른 언어에 해당되는 답변도 허용됩니다.

  • 답변 # 1

    가상 메모리가 놀랍기 때문에, 완전히 검색 할 수없는 방식으로 메모리에서 무언가를 삭제하는 것은 거의 불가능합니다. 최선의 방법은 값 필드를 제로화하는 것입니다. 그러나

    이것은 객체의 오래된 (0이 아닌) 사본이 사용되지 않은 스왑 페이지에 남아 있지 않아 재부팅 후에도 지속될 수 있음을 의미하지는 않습니다.

    다른 사람이 응용 프로그램에 디버거를 연결하고 객체가 제로화되기 전에 파고 들거나 VM을 중단하고 힙 덤프에서 파고 들지 못하게합니다.

  • 답변 # 2

    민감한 데이터를 배열에 저장 한 다음 가능한 빨리 "제로화"하십시오.

    RAM의 모든 데이터는 가상 메모리 시스템에 의해 디스크에 복사 될 수 있습니다. RAM의 데이터 (또는 코어 덤프)는 디버깅 도구로 검사 할 수도 있습니다. 이러한 일이 발생할 가능성을 최소화하려면 다음을 위해 노력해야합니다.

    시간 창을 비밀로 유지하십시오 짧은 메모리에 존재 가능

    IO 파이프 라인에주의하십시오 (예 : 내부적으로 BufferedInputStream) 버퍼 데이터

    비밀번호에 대한 참조를 스택 및 힙 외부에 유지

    같은 불변의 타입을 사용하지 마십시오 와이즈 비즈 비밀 유지하기 위해

    Java의 암호화 API는이 접근법을 사용하며, 생성 한 모든 API도이를 지원해야합니다. 예를 들어, String  발신자가 비밀번호 KeyStore.load 를 지우도록 허용 비밀번호 기반 암호화를위한 KeySpec과 마찬가지로 호출이 완료 될 때

    이상적으로, 당신은 char[] 를 사용합니다  다음과 같이 배열을 0으로 설정하십시오 :

    finally
    
    

  • 답변 # 3

    아무것도 삭제되지 않습니다. 응용 프로그램에 액세스 할 수 있거나없는 것입니다. 일단 액세스 할 수 없으면 공간이 필요할 때 후속 사용의 후보가되어 공간을 덮어 씁니다. 직접 메모리 액세스의 경우 항상 읽을 내용이 있지만 정크가되어 이해가되지 않을 수 있습니다.

  • 답변 # 4

    개체를 null로 설정한다고해서 개체가 메모리에서 제거된다는 의미는 아닙니다. 가상 머신은 해당 객체에 대한 참조가 더 이상 없으면 해당 객체를 가비지 수집 준비 상태로 표시합니다. 코드에 따라 null로 설정 한 경우에도 참조되지 않을 수 있으며,이 경우 제거되지 않습니다. (가비지 수집 될 것으로 예상하고 메모리 누수가없는 경우)

    수집 준비가 된 것으로 표시되면 가비지 콜렉터가 제거 할시기를 제어 할 수 없습니다. 가비지 콜렉션 전략을 어지럽 힐 수는 있지만 조언하지는 않습니다. 응용 프로그램을 프로파일 링하고 개체와 ID를 보면 참조하는 것이 무엇인지 확인할 수 있습니다. Java는 VisualVM에 1.6.0_07 이상을 제공하거나 NetBeans를 사용할 수 있습니다

  • 답변 # 5

    zacherates가 말했듯이 객체에 대한 참조를 제거하기 전에 객체의 민감한 필드를 제거하십시오. 문자열의 내용을 제로화 할 수 없으므로 char 배열을 사용하고 각 요소를 제로화하십시오.

    KeyStore ks = KeyStore.getInstance(KeyStore.getDefaultType()); InputStream is = … char[] pw = System.console().readPassword(); try { ks.load(is, pw); } finally { Arrays.fill(pw, '\0'); }

  • 이전 java - 어느 것이 더 빠릅니까? 진술 또는 준비된 진술
  • 다음 php - Symfony2 기능 테스트에서 인증 된 사용자를 사용하는 방법은 무엇입니까?