String 객체는 JVM(Java Virtual Machine)에서 GC(Garbage Collection)이 이루어질 때까지 메모리 상에 그대로 남아있어, 앱에서 사용한 중요정보(주민등록번호, 비밀번호 등)를 String 객체에 저장할 경우 악의적인 사용자에게 노출될 가능성이 존재한다.
따라서, String 객체 상에 중요정보를 없애거나 제거해야하는데 이 때 2가지 방식을 생각해볼 수 있다.
1. NULL로 String 객체 초기화
→ String 객체를 가리키는 reference만 제거되는 것이므로 메모리 상에 String 객체의 데이터는 그대로 존재하게 된다.
( 출처 : https://mixup.tistory.com/10 )
2. String 객체 덮어쓰기
→ String 객체 변수에 또 다른 문자열을 Overwrite를 하고자 하지만 실제로는 새로운 메모리를 생성하여 해당 메모리를 가리키는 것이므로, 메모리 상에 중요정보는 그대로 존재하게 된다.
( 출처 : https://mixup.tistory.com/10 )
아래 상세한 예시들을 통해 더 자세히 알아보도록 하자.
예시 1) String 객체 Overwrite 시도
1 2 3 4 5 6 7 8 9 10 11 12 13 | System.out.print("Original String password value: "); System.out.println(stringPassword); System.out.println("Original String password hashCode: " + Integer.toHexString(stringPassword.hashCode())); String newString = "********"; stringPassword.replace(stringPassword, newString); System.out.print("String password value after trying to replace it: "); System.out.println(stringPassword); System.out.println( "hashCode after trying to replace the original String: " + Integer.toHexString(stringPassword.hashCode())); | cs |
예시 1 결과) String 객체의 결과 새로운 값으로 덮어씌워지지가 않는 것을 확인
Original String password value: password
Original String password hashCode: 4889ba9b
String value after trying to replace it: password
hashCode after trying to replace the original String: 4889ba9b
예시 2) char[] Array Overwrite
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | char[] charPassword = new char[]{'p', 'a', 's', 's', 'w', 'o', 'r', 'd'}; System.out.print("Original char password value: "); System.out.println(charPassword); System.out.println( "Original char password hashCode: " + Integer.toHexString(charPassword.hashCode())); Arrays.fill(charPassword, '*'); System.out.print("Changed char password value: "); System.out.println(charPassword); System.out.println( "Changed char password hashCode: " + Integer.toHexString(charPassword.hashCode())); | cs |
예시 2 결과) Char Array의 경우 Overwrite가 가능함을 확인
Original char password value: password
Original char password hashCode: 7cc355be
Changed char password value: ********
Changed char password hashCode: 7cc355be
위의 테스트를 통해 String 객체는 덮어쓸 수 없지만, char[] 배열은 덮어쓸 수 있음을 확인할 수 있다.
이 뿐만 아니라, char[] 배열을 이용할 경우 콘솔, 모니터 등 보안적이지 않는 장소에서 예상하지 못한 패스워드 로깅에 대한 방지까지 된다는 장점이 있다.
예시 3) 패스워드 로깅 시도
1 2 3 4 | String passwordString = "password"; char[] passwordArray = new char[]{'p', 'a', 's', 's', 'w', 'o', 'r', 'd'}; System.out.println("Printing String password -> " + passwordString); System.out.println("Printing char[] password -> " + passwordArray); | cs |
예시 3 결과) String 배열의 결과 콘솔에 그대로 출력되지만, char 배열의 결과 콘솔에 그대로 출력되지 않음을 확인
Printing String password -> password
Printing char[] password -> [C@6e8cf4c6
<<참고>>
예시 3에서 System.out.println(passwordArray);를 할 경우엔 정상적으로 password라고 뜨지만 String과 합쳐서 사용될 때는 위와 같이 데이터가 그대로 출력되지 않는다.
https://www.baeldung.com/java-storing-passwords
http://egloos.zum.com/kwon37xi/v/4733673
https://stackoverflow.com/questions/8881291/why-is-char-preferred-over-string-for-passwords
'Hacking > Mobile' 카테고리의 다른 글
INSTALL_FAILED_OLDER_SDK (0) | 2020.03.05 |
---|---|
IOS Pinning bypass (0) | 2020.03.04 |
apktool decompile error solution (0) | 2019.04.24 |
APK 무결성 확인 (0) | 2019.04.20 |
Windows 환경에서 IOS device 로그 보기 (0) | 2019.03.28 |