이것은 메모리 데이터 보안 문제입니다.
자바 가비지 수집은 가비지 데이터를 안전하게 지 웁니 다?가비지 수집은 가비지 데이터를 안전하게 지 웁니까?
데이터 청크가 가비지 수집 된 후에는 더 이상 검색 할 수 없지만 해커가 여전히 데이터를 검색하기 위해 메모리 덤프를 할 수 있습니까?
이것은 메모리 데이터 보안 문제입니다.
자바 가비지 수집은 가비지 데이터를 안전하게 지 웁니 다?가비지 수집은 가비지 데이터를 안전하게 지 웁니까?
데이터 청크가 가비지 수집 된 후에는 더 이상 검색 할 수 없지만 해커가 여전히 데이터를 검색하기 위해 메모리 덤프를 할 수 있습니까?
이것은 JVM 구현 및 가능한 옵션에 따라 다르지만 데이터를 지우지 않을 것이라고 가정합니다. 가비지 콜렉션은 사용 가능한 영역 만 추적하면됩니다. 모든 데이터를 0 또는 다른 것으로 설정하는 것은 불필요한 많은 쓰기 작업입니다. 이러한 이유로 API에서 String 대신 암호 배열을 사용하는 경우가 자주 있습니다.
char 배열은 공격 성공 확률 만 감소 시키지만 전체 제거를 보장하지는 않습니다. –
@AndrewLygin Right. 나는 또한 자신이 배열을 지울 필요가 있다고 언급하지 않았다. 메모리 덤프에서 내용을 읽지 못하게하는 배열에 대한 본질적인 것은 없습니다. – JimmyJames
불행히도 여기에는 상황이 좀 더 복잡해지며 수동으로 데이터를 지우는 것이 항상 완벽하게 제거되는 것은 아닙니다. 자세한 내용은 내 대답을 참조하십시오. –
특히 Oracle JVM은 공간을 지우지 않으며 Eden과 Survivor 공간 사이의 데이터 만 복사합니다. 더 이상 사용되지 않는 오브젝트는 결국 덮어 쓰레기로 남아 있습니다. OldGen에서 비슷한 일이 일어나고, 일부 장소는 사용 된 것으로 표시되고, 오브젝트가 가비지 콜렉션에 적합하게되면 점유 한 곳은 사용되지 않는 것으로 표시됩니다. 충분한 응용 프로그램 시간이 주어지면 덮어 쓰여진 eventaully도 덮어 씁니다.
Oracle JVM은 일반적인 Java VM입니까? 저는 Android 앱 데이터 보안에 더 관심이 있습니다. –
@LiwenZhao Android (또는 Dalvik/ART)는 JVM이 아니므로 JVM에서 아무것도 적용 할 수 없습니다. 질문에'android'로 주석을 달아주세요. 오라클은 JVM, 참조 구현입니다. –
여기에 언급 된 다른 사용자와 마찬가지로 JVM은 가비지 수집 후에 메모리를 안전하게 지우지 않습니다. 성능이 크게 나빠질 수 있기 때문입니다. 그래서 많은 프로그램 (특히 보안 라이브러리)은 불변 (문자열 대신 char 배열) 대신 변경 가능한 구조를 사용하고 더 이상 필요없는 경우 데이터 자체를 정리합니다.
불행히도 그러한 접근법이 항상 작동하지는 않습니다. 이 시나리오를 살펴 보겠습니다.
전에, 그것은 처음 배치 된 메모리에 암호를 찾습니다
다른 해결책은 원하는대로 수동으로 처리 할 수있는 오프 힙 데이터를 사용하는 것이지만 순수 Java는 아닐 것입니다.
Go에서는 순수한 Go를 사용하여 syscall을 사용하여 커널 (mmap/virtualalloc 등)에서 직접 메모리를 요청할 수 있습니다. Java에서 이와 유사한 것이 가능한지 확실하지 않습니다. – Awn
관련 항목 : http://stackoverflow.com/questions/8881291/why-is-char-preferred-over-st-for-passwords-in-java – shmosel
메모리 보안은 어렵습니다. 누군가 휴대 전화로 데이터를 스캔하여 데이터를 검색하면 휴대 전화에서 대부분의 보안 정보를 얻을 수 있습니다. 스토리지 및 전송 중 데이터를 안전하게 보호하는 데 더 많은 노력을 기울일 수 있습니다. –
걱정되는 HIPAA 준수입니다. HIPAA 준수에 메모리 암호화가 필요한지 여부는 확실하지 않습니다. –