정보보호에서 Authentication, 즉 인증은 매우 중요한 요소입니다. 인증이란 시스템을 위해 또는 시스템에 의해 요청된 신원을 검증하는 과정입니다. 시스템을 사용하거나 정보를 요청하기 위해 매우 필수적인 요소입니다.
인증에는 크게 2가지 과정을 거칩니다.
이런 인증은 여러 의미로 나뉠 수 있습니다.
위와 같은 방식을 결합해서 많이 사용하게 되는데요, 결합하는 분류에 따라 2가지로 나뉩니다.
Multi-Factor : 다른 요소의 결합입니다. 지문 + 비밀번호, OTP + 음성인식 등입니다.
Multi-modal : 같은 modal을 함께 사용하는 방법입니다. is 에서 지문과 홍채를 함께 사용 하는 등의 방식입니다.
요즘 인증을 위해서 비밀번호 외에도 OTP, 지문, 홍채 등 다양한 방법을 사용하고 새로운 보안 인증을 위한 여러 방식들이 연구, 개발되고 있습니다. 그럼에도 가장 오래되고 보편적으로 많이 사용되는 인증방법이 비밀번호라는 것은 분명합니다. 하지만 다양한 방식 중 가장 취약한 인증 방법도 비밀번호 입니다. 사람들은 취약하다는 생각보단 본인이 기억하기 쉽고, 입력하게 편한 비밀번호를 선호하게 됩니다. 이러한 비밀번호는 매우 취약하여 정보보호 측면에서 매우 위험합니다. 사람들이 많아 사용하는 비밀번호 특징들은 아래와 같습니다.
Default password : password, default, admin, guest 등
Dictionary words: hello, apple, banana, ManU 등
Words with number substitutions : password1, Real10 등
Words with simple obfuscation : P@ssW0rd, @bcde 등
Doubled words : abcabc, ReadRead, BoomBoom 등
Common sequence : qwert, qwer1234, 1234567, asdfgh 등
Numeric sequences based on well known numbers
Identifiers : 1/10/1994, 010-0000-1234 등
Anything personally related to you : 주민등록번호, 생일, 전화번호, 학번, 학교 등
위와 같은 비밀번호에 속하신다면 지금 당장 비밀번호를 변경할 것을 권고합니다. 매우 보안에 취약한 상태입니다. 많은 사람들이 보안에 강한 비밀번호를 만들고 싶지만 쉽지 않습니다. 특히 본인과 전혀 연관없는 형태의 비밀번호는 외우는게 매우 힘들죠. 그럼 조금이라도 강화하기 위한 방안은 무엇일까요? 많은 회원가입을 위한 서비스에서 추천하는 숫자, 특수문자, 소문자, 대문자를 우선적으로 섞어서 생성하는 방법입니다. 추가로 비밀번호의 길이도 길게 할수록 좋겠죠. 아까 위에서 설명한 유추하기 쉬운 비밀번호는 피하는게 가장 좋습니다. 반복되는 문자도요!
서비스 개발자들이 이런 취약점에도 보호하기 위해 다양한 기법을 사용해서 보안성을 높이고 있습니다. 비밀번호를 기억하지 않고 단방향 해쉬함수를 이용해 서버가 해킹을 당해도 비밀번호를 알 수 없도록 하거나, 몇 회 이상 틀렸을 시 로그인을 하지 못하게 잠군다거나 하는 방법들입니다. 그럼에도 매우 간단한 비밀번호 설정은 Brute-Force 방식으로 쉽게 비밀번호를 알아낼 수 있습니다.
그럼 비밀번호를 해쉬화하는 것만으로 안정성 보장이 될까요? 그렇진 않습니다. 서버가 보안이 100% 완벽하다면 괜찮겠지만, 그러기엔 쉽지 않습니다. 그럼 해쉬된 비밀번호를 데이터를 취득했다고 하면 어떻게 비밀번호를 추측할 수 있을까요? 추측 가능한 방법이 있다면 단방향 해쉬도 안전하진 않을겁니다. 여러 방법들이 있겠지만, 그 중 Rainbow Table 기법에 대해 간략히 소개 드리겠습니다.
Rainbow Table은 brute force보다 훨씬 좋은 성능을 내는 방법입니다. 암호화된 비밀번호를 풀어내기 위해 미리 계산된 테이블을 이용하여 비밀번호를 구해내는 방법입니다. Rainbow Table은 시간과 메모리의 Trade off가 큰 방법입니다. 사전에 정의된 단어를 해쉬함수를 이용해 해쉬값을 구하고 Reduce 함수를 이용해 새로운 값을 구합니다. 그 후 다시 해쉬함수를 이용해 새로운 해쉬값을 만들고 다시 Reduce 함수를 이용하고... 하는 과정을 반복하게 됩니다.
(출처 : 위키피디아 https://ko.wikipedia.org/wiki/%EB%A0%88%EC%9D%B8%EB%B3%B4_%ED%85%8C%EC%9D%B4%EB%B8%94)
위 그럼에서 첫 번째 라인을 보시면 wikipedia를 해쉬화 해서 ao4kd 란 값을 얻었고 다시 Reduce함수를 이용해 secret 이란 값을 구합니다. 다시 secret을 해쉬화하고.. 다시 Reduce함수로 반복하다 보면 마지막엔 rootroot만 값을 구할 수 있습니다. 이런 과정을 통해 테이블을 만들게 됩니다. 그럼 이걸로 어떻게 비밀번호를 유추 할까요?
테이블을 생성할 때 위의 모든걸 저장하는게 아니라 처음 시작값과 끝 값만 가지고 있습니다. 위의 과정을 거쳤을 때 생성되는 테이블은 아래와 같습니다.
wigipedia | rootroot
abcdefgh | myname
.....
passwd | linux123
시작과 끝값만을 이용해 테이블을 만들어 냅니다. 이런 방식으로 하면 메모리가 매우 적게 듭니다. 하지만 그만큼 계산해야 하는 시간은 늘어날 겁니다. 비밀번호를 유추하는 시간이 늘어나더라도 공간을 절약할 수 있는 이점이 있습니다. 그럼 다시 그림을 보면서 어떻게 비밀번호를 유추하는지 설명드리겠습니다.
훔친 Hash값을 이용해서 시작합니다. 만약 탈취한 정보에서 re3xes만 값을 이용한다고 가정해봅시다. 첫 번째 테이블부터 Reduce함수 Rn에서 R1순으로 대입하여 비밀번호를 구하게됩니다. 위 예시는 Reduce함수가 1,2,3 까지 존재하네요. 그럼 먼저 R3함수를 이용해서 re3xes값의 값을 찾으면 rambo만 값이 나온다고 합시다. 하지만 rambo는 어디에도 없으니 잘못 찾았네요. 다음 R2 함수에 대입해 봅시다. crypto란 값이 나올겁니다. crypto는 체인안에 존재하니 쭉 진행해봅니다. 진행하다보니 마지막 linux123을 구할 수 있습니다. linux123이 레인보우 테이블 내에 존재하네요! 그럼 이제 시작 값인 passwd를 이용해 다시 Hash -> Reduce를 반복하면 re3xe3란 해쉬값은 culture만 값을 해쉬화 하였음을 알 수 있습니다. 이렇게 비밀번호를 찾아내는 방법이 Rainbow table 입니다.
그럼 Rainbow Table을 이용한 공격에 대비하기 위해 어떤 방법이 나왔을까요? Salt에 대해 정리해보겠습니다.
Salt는 Rainbow Table과 같이 미리 계산하여 생성해놓은 값을 이용한 공격을 막기 위해 만들어 졌습니다. 서버의 DB에 비밀번호를 저장할 때 Hash된 값만 저장했다면 Salt란 값과 비밀번호와 Salt란 값을 연산한 값을 해쉬함수에 입력함으로서 보안성을 향상시켰습니다. 이러한 경우 공격자가 해쉬된 비밀번호를 알아내더라도 비밀번호를 역으로 유추하기 매우 어려워집니다. 또한 사용자마다 다른 Salt를 사용한다면? 테이블을 만들어 내기 더 어려워 질 것 같습니다.
단방향 해쉬함수를 연속적으로 사용함으로서 보안성을 향상시킨 기법입니다. 처음에 Alice란 사용자가 비밀번호를 입력하여 인증 요청을 하면 서버에서는 Alice란 유저에 대해 비밀번호를 몇 번 해쉬함수를 적용할지에 대한 n 값과 hash_n(P0)값이 존재합니다. 이 n 값은 다시 사용자에게 전달되게 됩니다. n 값이 계속 업데이트 되면서 Alice란 유저는 그에 맞도록 초기 비밀번호를 n번 해쉬함수를 적용한 비밀번호가 이용을 위해 입력됩니다.
h^n(x) = h(h^n-1(x))
h(h^n-1(x) = h(h^n-2(x))
....
h1(x) = h(x)
사용자는 x에 대해서만 알고있으면 됩니다. 단방향이기에 여러번 해쉬함수를 적용함으로써 역함수 계산을 매우 어렵게 만드는 방법입니다.
이후에도 다양한 공격기법이 나오고 다양한 방어기법들이 개발되어 왔습니다. 기회가 된다면 다음에 전체적으로 정리 할 수 있으면 좋겠네요. 지금은 인증에 관련된 글을 정리하고자 하니 이정도에서 인증을 위한 여러 기법들이 적용되고 있다라는 것만 알아주셨으면 좋겠습니다.
하드웨어의 발전으로 오랜 시간 걸리면 연산이 매우 짧은시간에 수행됨에따라 어떠한 비밀번호 암호화도 빠른 시간내에 해결되고 있습니다. 오직 Brute-force만으로 모든 비밀번호를 추정할 수 있는 단계까지 성장하고 있습니다. 비밀번호가 복잡하면 할수록 추정하는데 시간이 오래 걸리게되니 비밀번호는 항상 위에서 나열한 취약점은 피하고 복잡하고 어렵게 만드시는게 가장 좋습니다.
시스템에서 사용자 인증할 경우 발생할 수 있는 문제로 False positive와 False Negative가 있습니다. 잘못된 인증이 인증 성공이라고 확인되는 경우를 False positive라 하고 제대로 된 정보를 입력했음에도 인증 거절되는 것이 False negative입니다. 인증 측면에서 False Positive와 False Negative는 어떻게 되어야 할까요? 당연히 False Negative가 높아야 합니다. 잘못된 정보로 인증될바엔 정확한 정보로 인증을 했을 때 실패하더라도 잘못된 정보로 인증되는 일은 없도록 만드는게 보안측면에서 매우 좋을 것 같습니다.
이상으로 인증에 대해 간랸하게 정리해보았습니다.
감사합니다.