타이밍 어택

요번에도 보안이랑 관련된 내용이다. 우리는 프로그래밍을 할 때 같은 문자열인지를 알아내기 위해 종종 toEquals를 쓰고는 한다.

이 메소드의 문제점이 무엇이냐면 “yotaiji” 라는 문자열과 똑같은지 비교를 한다고 하자. 그러면 처음엔 y, 그 다음엔 o, 그 다음엔 t… 이와 같은 순서로 첫번째 문자부터 하나씩 비교를 해간다.

만약 내가 “yaaaaaa” 라는 문자열을 넣었다면 두번째 문자를 비교할 때 다르다는 걸 알게 되고 컴퓨터는 return false를 할 것이다.

그 다음엔 “yoaaaaa” 를 넣어본다. 그러면 세번째 문자에서 false를 보여줄 것이다.

여기서 프로그래밍 수행 속도가 조금 차이가 난다고 한다. 물론 쉽게 측정은 안되지만 어느정도 시도를 하다보면 마이크로초, 또는 나노초 단위로 문자열이 다른지를 비교하는 시간이 차이가 난다.

이걸로 해커들이 중요한 키 값이나 비밀번호 등을 알아낼 수 있다고 한다. 이를 해결하는 가장 간단한 방법은 앞의 문자에서 다르다는 걸 깨달아도 무조건 끝까지 비교하는 코드를 새로 만들어 이용하면 언제나 수행시간이 거의 같으므로 타이밍 어택을 피할 수 있다.