사용자에게서 비밀번호를 입력받아 저장하거나, 올바른 사용자인지 검증하는 과정에서 필연적으로 컨트롤러에서 비밀번호를 받아서 잠시동안 메모리에 가지고 있을 수 밖에 없다.
물론 SSL과 비밀번호 암호화(복호화가 불가능한 SHA2 + SALT 등으로)를 하겠지만, 암호화를 하기전 중간 과정에 메모리에 비밀번호가 남아있는 그 동안에도 보안에 신경써야 한다.
그래서 비밀번호를 String이 아닌 char []로 저장하는 것이 좋다.
String은 불변 객체로 JVM에서 GC가 일어날 때까지 메모리에 그대로 남아 있으며, 그럴 때 메모리 덤프를 뜨면 비밀번호를 알아내는게 가능하다고 한다.
또한 절대로 해서는 안되는 짓이긴 하지만 요청을 처리하는 중간 과정 어디에선가 실수로 비밀번호를 출력한다고 하자.
이때 그 값은 toString()의 결과가 찍히기 되는데, 문자열로 저장하면 비밀번호가 그대로 찍히게 된다.
하지만 문자 배열의 경우에는 객체를 가리키는 엉뚱한 문자가 찍히게 된다.
따라서 비밀번호를 다뤄야 하는 곳에서는 String이 아닌 char []을 사용하자!
Why character array is better than String for Storing password in Java
Best Practices while dealing with Password in Java
물론 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
덧글