JavaRush /Java Blog /Random-KO /Q&A: Java에서 문자열이 아닌 문자 배열로 비밀번호를 저장하는 것이 더 나은 이유는 무엇입니까?

Q&A: Java에서 문자열이 아닌 문자 배열로 비밀번호를 저장하는 것이 더 나은 이유는 무엇입니까?

Random-KO 그룹에 게시되었습니다
Java Junior 포지션에 대한 인터뷰에서 그러한 질문을 들을 수 있을 것입니다. 그런데 내 친구가 기술 리드 자리에 대한 면접에서 이런 질문을 받았습니다.
Q&A: Java에서 문자열이 아닌 문자 배열로 비밀번호를 저장하는 것이 더 나은 이유는 무엇입니까?  - 1
, 및 문자 배열을 모두 String사용하여 텍스트 데이터를 저장할 수 있습니다. 그러나 아직 비슷한 상황이 발생하지 않은 경우 특정 작업을 위해 의식적으로 둘 중 하나를 선택하는 것은 어렵습니다. 하지만 내 친구가 지적했듯이 와 관련된 모든 질문에는 String일반적으로 불변성( )이라는 문자열의 특별한 속성이 포함되어 Immutable있으며 그는 인터뷰에서 이를 활용했습니다. char []이제 비밀번호를 저장하기 위해 을 사용해야 하는 몇 가지 이유를 살펴보겠습니다 String.

이유 1. 문자열은 변경할 수 없습니다.

Java에서는 문자열을 변경할 수 없으므로 가비지 수집기가 이를 지울 때까지 일반 텍스트 비밀번호를 메모리에서 사용할 수 있습니다. 그리고 재사용을 위해 String사용되기 때문에 String pool비밀번호가 오랫동안 메모리에 남아있을 가능성이 상당히 높아 전혀 안전하지 않습니다.
Java 문자열 풀은 특별한 장소인 힙에 위치한 풀 또는 개체(문자열) 집합입니다. Java의 문자열은 가장 일반적인 데이터 유형 중 하나입니다. 이는 기본 유형이 아니라 객체입니다. 리소스를 많이 사용하기 때문입니다. 따라서 4개의 문자로 구성된 문자열을 저장하려면 56바이트의 메모리를 할당해야 합니다. 이것이 다른 객체와 마찬가지로 문자열이 힙에 저장되는 이유입니다.
메모리 덤프에 접근할 수 있는 사람은 누구나 일반 텍스트로 비밀번호를 찾을 수 있습니다. 이는 일반 텍스트가 아닌 암호화된 비밀번호를 사용하는 것이 좋은 이유입니다. 문자열은 변경할 수 없으므로 내용을 변경할 수 없습니다. 변경하면 새 줄이 만들어집니다. 그러나 의 경우 char []해당 요소를 0이나 빈 문자로 바꿀 수 있습니다. 따라서 비밀번호를 문자 배열로 저장하면 비밀번호 가로채기 위험이 확실히 줄어듭니다.

이유 2. 저자의 추천

Java 자체(물론 제작자를 통해 getPassword ()) JPasswordFieldchar []. 더 이상 사용되지 않는 방법을 시도해 볼 수도 있습니다 getText (). 언어 작성자의 권장 사항을 따르지 않겠습니까?

이유 3. 인쇄

유형을 사용하면 String문자열에 저장된 텍스트가 로그 파일이나 콘솔에 인쇄될 위험이 항상 있습니다. 동시에 를 사용하면 Array배열의 내용이 인쇄되지 않고 메모리 내 위치만 인쇄됩니다. 물론 이것이 심각한 이유는 아니지만 여전히 의미가 있습니다.
String strPassword = "Unknown";
char [] charPassword = new char [] {'U', 'n', 'k', 'w', 'o', 'n'};
System.out.println ("String password:" + strPassword);
System.out.println ("char password:" + charPassword);

String password: Unknown
Character password: [C@110b053
물론, char []Java를 사용하여 비밀번호를 저장하는 것 자체가 만병통치약은 아닙니다. 비밀번호를 일반 텍스트로 저장하는 대신 해시로 작업하고 비밀번호를 암호화하는 등 보안 예방 조치를 취해야 합니다. 그리고, 물론 인증절차가 끝나면 바로 메모리에서 삭제해 주셔야 합니다. Javarevisited의 자료를 기반으로 함
코멘트
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION