2012-05-04 3 views
22

전 결코 생각하지 못했지만, 문자 배열을 반환하는 getPassword 메서드를 사용하고 getText 메서드를 보았습니다. 은 더 이상 사용되지 않습니다.. 하지만 이제는 왜이 방법이 인데 왜?이 사용되지 않았겠습니까?JPasswordField의 getText()가 사용되지 않는 이유는 무엇입니까?

자바 문서 설명 :

을 추천하지 않습니다. Java 2 플랫폼 v1.2 이후는 getPassword로 바뀌 었습니다.

구성 요소가 나타내는 텍스트의 일부를 가져옵니다. 길이가 0 인 경우 빈 문자열을 반환합니다.

보안상의 이유로이 메서드는 사용되지 않습니다. 대신 getPassword 메서드를 사용하십시오.

하지만 그 보안상의 이유로은 무엇입니까? 이것에 대한 아이디어가 있습니까?

미리 감사드립니다.

+2

에 http : // 유래.com/questions/983964/why-does-jpasswordfield-getpassword-create-a-string-in-the-password – Garbage

답변

36

getText을 호출하면 변경 될 수없는 (변경 불가능한) 문자열 (변경 불가능한 개체)이 생겨서 가비지 수집 될 때까지 암호가 메모리에 유지됩니다.

getPassword을 호출하면 수정할 수있는 char 배열이 생기므로 암호가 실제로 메모리에 남아 있지 않습니다.

8

암호 배열을 문자 배열이 아닌 문자열로 요청하면 암호가 들어있는이 문자열이 Java 런타임 메모리에 일정하지 않은 시간 동안 떠 다니게됩니다. 악의적 인 Java 구성 요소 또는 외부 프로그램에 의해 거기에서 읽혀질 수 있습니다.

대신 char 배열을 사용하면 암호를 확인한 다음 즉시 스크램블 할 수 있습니다.

5

Java String 풀 (자세한 내용은 this SO question 참조)입니다. 해당 암호 필드의 내용을 String으로 변환하면 (getText 메서드를 사용하면 어떻게됩니까?) String은 풀에 배치되며 다른 사용자가 읽을 수 있습니다.

당신이 (@Garbage 귀하의 질문에 주석으로 게시 SO question에서 볼 수 있듯이)이 조심스럽게 String을 만드는 것을 피한다 볼 수 getPassword 메소드의 구현을보고 싶다면. 이 또한

if (Arrays.equals("mySuperSecretPassword".toCharArray(), passwordField.getPassword())) 

같은 것을하지 말아야 또는 당신은 여전히 ​​풀에 암호를 넣어 끝낼 의미하며, 다음과 같은 쉽게 getText 방법을 사용했을 수

참고.

+0

"Java 문자열 풀"은 컴파일 타임에 intern'ed 상수를위한 것입니다. 표준 스윙 텍스트 입력 *은 실제로 입력 된 텍스트 값을 사용합니다. 필자의 이해는 immutable String이 아닌 char [] 배열을 반환하면 작업 메모리 (보안 모범 사례)에서 노출/가시성을 최소화하기 위해 암호를 즉시 0으로 설정할 수 있습니다. String은 어떤 경우에도 '인턴'될 것으로 기대되지 않습니다. –

5

이 시도 :

String myPass=String.valueOf(passwordField.getPassword()); 
+1

OP는 * 패스워드를'String' *으로 얻는 방법을 묻지 않습니다; 그는 왜 패스워드가'String' 대신'CharrArray'로 반환되는지 묻습니다. – Barranka

관련 문제