방대한 문서보다 동작하는 소프트웨어

개발

중요 정보가 평문 으로 노출되지 않도록(메모리 덤프) 막기

꽃게장세트 2022. 3. 11. 18:23

중요한 정보를 String 타입에 할당하여 사용하면, 메모리 덤프에서 평문이 노출되게 된다. 비밀번호를 password라고 설정했다고 가정하자. 이를 변수에 그대로 할당 후 의도적으로 메모리를 덤프했을 때 password 가 Hex(16진수) 코드들 사이에 그대로 노출되는 것을 확인할 수 있다. String 변수에 담아 사용 후, 변수에 null을 할당한다고 해도 메모리에는 password 가 여전히 평문으로 남아있다. null은 새로운 메모리 주소에 할당되기 때문이다. 그러므로, 중요 정보는 String 타입에 담지 말고 Char형태를 배열에 담아 사용하도록 하자. 사용 후에는 반드시 다른 값으로 채워주자.

fun overwrite() {
  val password = charArrayOf('p','a','s','s','w','o','r','d',)
  val target = 0x20.toChar()
  
  // 비번사용
  println("origin password: ${String(password)}")
  println("origin password hashcode: ${Integer.toHexString(password.hashCode())}")
  
  // 사용 후 메모리에 빈값으로 덮어쓰기
  Arrays.fill(password, target)
  
  // 출력 테스트
  println("overwrite password:${String(password)}")
  println("overwrite password hashcode:${Integer.toHexString(password.hashCode())}")
}