-
[보안] Timing Attack프로그래밍/짧은 기록 2019. 12. 14. 01:27
오늘 주니어 세미나에서 평소에 생각이 전혀 닿지 못한 이야기를 들어서 기록합니다. 자세하게 다루지는 못하고 세미나에서 들은 예시와 의미 정도만 기록하려고 합니다.
right_password = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" answer1 = "BBCDEFGHIJKLMNOPQRSTUVWXYZ" answer2 = "ABCDEFGHIJKLMNOPQRSTUVWXYA" answer3 = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" def check_password(answer): for index, letter in enumerate(right_password): if answer[index] != letter: return False return True print(check_password(answer1)) # False print(check_password(answer2)) # False print(check_password(answer3)) # True
비밀번호를 확인하기 위해 다음과 같은 함수를 만들었습니다. 최대한 빠른 처리를 위해 실제 비밀번호와 다른 글자를 발견하자마자 루프를 종료하고 False를 반환하게 했고 만약 모든 글자가 같다면 True로 종료되게 했습니다. (글자 수가 달라서 Out Of Index가 발생하는 경우는 예시에서는 제외했습니다.)
비밀번호가 맞냐 틀리냐를 판단하는 기능이니 최대한 빠르게 답을 내놓으면 무조건 좋다고 생각했는데 꼭 그렇지는 않았습니다. answer1은 첫 번째 글자에서 답이 바로 나오고 answer2는 마지막 글자까지 가야 답이 나옵니다. 저런 흐름이 일정하다면 첫 글자는 A구나, 두 번째는 B구나... 하는 식으로 실제 비밀번호를 알아내는데 실행 시간이 힌트가 될 수 있다는 것이었습니다.
그래서 위의 기능은 어떤 경우에도 실행 시간이 비슷하게 나오도록 다음과 같이 수정해야 합니다.
right_password = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" answer1 = "BBCDEFGHIJKLMNOPQRSTUVWXYZ" answer2 = "ABCDEFGHIJKLMNOPQRSTUVWXYA" answer3 = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" def check_password(answer): result = True for index, letter in enumerate(right_password): if answer[index] != letter: result = False return result print(check_password(answer1)) # False print(check_password(answer2)) # False print(check_password(answer3)) # True
이렇게 바꾸면 틀린 비밀번호라도 for loop를 모두 돌게 됩니다. 위와 비교해서 어느 위치에서 비밀번호가 틀려도 실행 시간의 차이가 크게 차이나지 않을 것입니다.
굉장히 단순한 예시이고 실제 결과는 다를 수도 있지만 중요한 것은 무조건 최적의 성능을 내는 것이 좋은 것은 아니라는 점입니다. 오늘 좋은 이야기를 참 많이 들은 세미나지만 가장 기억에 남고 개발에서 또 새로운 시각을 느낄 수 있었던 예시라서 기록으로 남기고 싶었습니다.
출처: 2019년 12월 13일 DevGround Junior 2019 - 유데미 강대명 강연자님의 '오픈소스 속에서 성장하기' 중에서
'프로그래밍 > 짧은 기록' 카테고리의 다른 글
프론트엔드 기술 면접 대비해서 준비했던 짧은 한 줄들 (0) 2022.07.28 [Java] 제네릭을 사용하는 함수 (0) 2020.01.31