Java에서 비밀번호는 char [] 로 저장하자. 프로그래밍

사용자에게서 비밀번호를 입력받아 저장하거나, 올바른 사용자인지 검증하는 과정에서 필연적으로 컨트롤러에서 비밀번호를 받아서 잠시동안 메모리에 가지고 있을 수 밖에 없다.
물론 SSL과 비밀번호 암호화(복호화가 불가능한  SHA2 + SALT 등으로)를 하겠지만, 암호화를 하기전 중간 과정에 메모리에 비밀번호가 남아있는 그 동안에도 보안에 신경써야 한다.

그래서 비밀번호를 String이 아닌 char []로 저장하는 것이 좋다.

String은 불변 객체로 JVM에서 GC가 일어날 때까지 메모리에 그대로 남아 있으며, 그럴 때 메모리 덤프를 뜨면 비밀번호를 알아내는게 가능하다고 한다.
또한 절대로 해서는 안되는 짓이긴 하지만 요청을 처리하는 중간 과정 어디에선가 실수로 비밀번호를 출력한다고 하자.
이때 그 값은 toString()의 결과가 찍히기 되는데, 문자열로 저장하면 비밀번호가 그대로 찍히게 된다.

하지만 문자 배열의 경우에는 객체를 가리키는 엉뚱한 문자가 찍히게 된다.

String strPassword="Unknown";
char[] charPassword= new char[]{'U','n','k','w','o','n'};
System.out.println("String password: " + strPassword);
System.out.println("Character password: " + charPassword);

String password: Unknown
Character password: [C@110b053

따라서 비밀번호를 다뤄야 하는 곳에서는 String이 아닌 char []을 사용하자!

Why character array is better than String for Storing password in Java
Best Practices while dealing with Password in Java

덧글

  • 난누구여긴어디 2012/08/31 14:57 #

    좋은 정보 감사합니다~ ^^
  • 2013/09/06 01:51 # 삭제

    좋은글 감사합니다. 잘보고가요.
※ 로그인 사용자만 덧글을 남길 수 있습니다.