스택큐힙리스트

왜 비밀번호에 대해 char[]이 String 보다 우선 적용됩니까? 본문

카테고리 없음

왜 비밀번호에 대해 char[]이 String 보다 우선 적용됩니까?

스택큐힙리스트 2023. 3. 12. 10:36
반응형

스윙에서, 패스워드 필드는 보통의 getText() ( String 반환) 방법 대신에 getPassword() ( char[] 반환) 방법을 가지고 있습니다. 비슷하게, 패스워드를 처리하기 위해 String 을 사용하지 않도록 제안이 나왔습니다.

비밀번호에 String이 사용될 때 왜 보안에 위협이 될까요?

char[]를 사용하는 것이 불편해 보이는데요.

답변 1

문자열은 변경할 수 없습니다. 즉, 한 번 생성한 이후 다른 프로세스가 메모리를 덤프할 수 있다면, reflection을 제외하고 데이터를 제거할 방법이 없습니다. garbage collection 이 작동하기 전에.

배열을 사용하면 사용이 끝난 후 데이터를 명확하게 삭제할 수 있습니다. 어떤 것이든 배열을 덮어쓸 수 있으며, 쓰레기 수집 이전에도 시스템 어디에서도 비밀번호가 나타나지 않습니다.

그래, 이것은 보안 문제입니다 - 하지만 char[]를 사용하면 공격자의 기회 창이 줄어들기는 하지만, 이것은 이러한 특정 유형의 공격에 대해서만 해당됩니다.

댓글에서 언급된 대로, 가비지 컬렉터에 의해 이동되는 배열은 메모리에 떠돌이 데이터 복사본을 남길 수 있습니다. 이것은 구현에 따라 다를 수 있는데, 가비지 컬렉터가 이러한 일을 방지하기 위해 가는 길에 모든 메모리를 지울 수도 있습니다. 하지만 그래도 char[]에 실제 문자가 있는 공격 창문이 존재합니다.

답변 2

암호를 저장할 때 String 대신 char[]을 사용하는 것이 좋은 이유는 무엇일까요? String은 변경이 가능한 객체이기 때문에 암호와 같은 민감한 정보를 저장하기에 적절하지 않습니다. 이에 따라 char[]가 보안상 더 안전한 선택입니다.

String은 불변 객체이며 해당 객체가 메모리에서 생성된 이후에 변경할 수 없습니다. 따라서 암호와 같은 민감한 정보가 String으로 저장되면 해당 정보에 대한 레퍼런스는 JVM의 메모리 내에서 계속 유지됩니다. 이 경우 다른 객체가 String 객체를 참조하고 해당 객체를 수정할 수 있다면, 해당 문자열의 암호는 변경됩니다.

하지만 char[]은 변경 가능한 배열이 아니기 때문에 암호와 같은 민감한 정보를 저장할 때 String보다 더욱 안전합니다. char[]에서 사용한 값은 메모리에서 생성된 이후에다 바로 변경할 수 있습니다. 이렇게 하면 암호 값을 변경하는 데에도 문자 데이터 타입을 사용할 수 있습니다.

그러나 프로그래머가 암호 처리를 다루는 적절한 방식을 고려하지 않는다면 char[]를 사용하는 것만으로 충분하지 않습니다. 암호를 안전하게 저장하려면 암호화 방법을 사용해야 합니다. Java에서는 javax.crypto 패키지를 사용하여 암호화를 수행할 수 있습니다.

결론적으로, 암호와 같은 민감한 정보를 안전하게 저장하려면 String 대신 char[]을 사용해야 합니다. 하지만 더욱 안전한 방법을 선택하려면 암호화 방법을 사용하는 것이 좋습니다. 따라서 프로그래머는 예상치 못한 상황이 발생해도 적용하기 쉬운 암호화 방법을 계속해서 고민해야 합니다.

반응형
Comments