보안/정보

개인정보 보호방법) 2. 비밀번호를 다시 사용하지 않기

마리사라 2021. 2. 28. 17:09
반응형

저번 게시글에서는 비밀번호의 길이와 복잡함의 중요성에 대해서 말씀드렸습니다. 이번에는 비밀번호를 여러 사이트에서 반복해서 사용하면 안 된다는 것에 대해서 알려드리려고 합니다.


1. 비밀번호를 다시 사용

구글) 비밀번호 진단 결과

대부분의 사이트는 활동을 하기 위해서는 회원가입을 해야 합니다. 이때 아이디와 비밀번호를 설정하게 되는데, 매번 비밀번호를 만들기도 귀찮고, 기억하기도 힘드니 같은 비밀번호로 여러 사이트에 회원가입을 하시는 경우가 많으실 겁니다. 문제는 이렇게 만들어진 계정은 사용자가 기억하기는 쉽지만, 동시에 해커들도 해킹하기에 쉬운 계정이 됩니다.


2. 사전 공격

사람들은 무언가 모르는 단어가 있을 때, 사전을 찾습니다. 사전에는 여러 학자들이 단어의 이름과 뜻을 미리 등록해 놓았기 때문에 우리는 손쉽게 단어의 뜻을 알 수 있습니다.

 

해커들도 마찬가지로 우리의 정보를 빼내기 위해서 사전을 만듭니다. 이 사전은 자주 사용되는 유명한 비밀번호들 일 수도 있고, 다른 사이트에서 유출된 누군가의 비밀번호 일 수도 있습니다. 이렇게 만들어진 사전의 비밀번호들로 로그인을 시도하는 방법을 사전 공격(Dictionary Attack)이라고 합니다.


3. 예시

예를들어 제가 비밀번호를 외우기 쉽게 "superman"라고 비밀번호를 지었다고 가정하겠습니다. 이 비밀번호는 9자리이며, 해커가 단순히 영문만 썼다는 것을 미리 알고 있어도 26^8의 경우의 수를 만들어서 시도해야 합니다. 이는 제 컴퓨터를 기준으로 약 38분이 걸리는 난이도입니다.

 

2008년 최악의 비밀번호 500개 (출처:whatsmypass.com)

이제 해커는 자신의 사전을 이용해서 해킹을 시도할 것 입니다. 사전은 2008년의 최악의 비밀번호 Top 500의 것들로 구성되었다고 하겠습니다.

 

Excel) 최악의 비밀번호 500개

위 사이트에서 발표한 최악의 비밀번호 500개를 Excel에 넣어 사전을 만들었습니다.

 

def dictionary_attack(word):
    dic = openpyxl.load_workbook('dic.xlsx')
    sheet = dic.active
    for i in sheet.rows:
        if i[0].value == word:
            print("비밀번호 : " + i[0].value)
            print("소요시간 : " + str(time.time() - start))

이제 파이썬의 openpyxl 모듈을 이용하여 엑셀에 접근해 보겠습니다. 해당 함수에 입력된 word가 해당 Excel에 있다면 그 값과 걸린 시간을 알려주는 프로그램입니다.

 

그렇다면 사전 공격을 통해 비밀번호를 알아보겠습니다.

사전 공격 결과와 시간

무차별 대입 공격(브루트 포스)로 약 30분 정도 걸릴 비밀번호가 사전 공격으로는 0.8초 만에 뚫립니다. 물론 이번 비밀번호는 superman이라는 매우 쉬운 비밀번호로 만들었기 때문에 최악의 비밀번호 500개 안에 있었습니다. 하지만 이것은 단순한 예시일 뿐입니다.

 

def dictionary_attack(word):
    dic = openpyxl.load_workbook('dic.xlsx')
    sheet = dic.active
    count = 0
    for i in sheet.rows:
        if i[0].value == word:
            print("비밀번호 : " + i[0].value)
            print("소요시간 : " + str(time.time() - start))
            count = 1
    if count == 0:
        print("해당 단어가 없습니다")

이번에는 id="marisara" password="marisara1234"라는 계정을 가정해 보겠습니다. 12자리의 소문자 + 숫자의 비밀번호이기 때문에 36^12승의 경우의 수를 가집니다. 이것은 무차별 대입 공격으로는 풀 수 없는 난이도의 비밀번호입니다. 또한 marisara라는 단어는 해당 사전에는 없는 단어입니다.

 

사전 공격 결과

 

이제 해커는 단순히 사전에 있는지만 체크하지 않고, 새로운 시도를 할 것입니다. 로그인하지 않고 확인할 수 있는 정보들인 id, 생일, 이름등을 서로 조합하거나 사전과 조합해서 만들어 볼 것입니다. 이때 확인할 수 있는 정보로 id="marisara", 생일="0101", 이름="Hong_Gildong"이라고 하겠습니다.

def dictionary_attack(word):
    dic = openpyxl.load_workbook('dic.xlsx')
    sheet = dic.active
    count = 0
    new_dic = ['marisara', '0101', 'Hong_Gildong']
    for i in sheet.rows:
        for j in new_dic:
            if j + str(i[0].value) == word:
                print("비밀번호 : " + j + str(i[0].value))
                print("소요시간 : " + str(time.time() - start))
                count = 1
    if count == 0:
        print("해당 단어가 없습니다")

사전 공격 결과

이번에도 별 소용없이 뚫렸습니다. 물론 이 경우에는 사전 공격보다는 사회공학적 공격에 가까울 수도 있습니다. 하지만 확인할 수 없던 단어인 "1234"와 유추하기 쉬운 단어인 "marisara"의 조합으로 만든 공격이기 때문에 사전 공격이라고 할 수도 있습니다.

 

 

이제 이번 글의 주제인 같은 비밀번호를 여러번 사용하면 안 되는 이유입니다. 이번에는 비밀번호를 "MaR!$aRa11?"로 만들었다고 해보겠습니다. 이 경우는 사전에는 당연히 존재하지 않으며, 다른 방식으로도 유추하기 힘든 비밀번호입니다. 또한 소문자 + 대문자 + 숫자 + 특수문자의 조합이기 때문에 무차별 공격으로도 뚫기 힘든 안전한 비밀번호입니다. 이 비밀번호를 수십 개의 사이트에 똑같이 사용했다고 가정하겠습니다.

 

문제는 어느 한 사이트의 정보가 유출되어 해당 비밀번호가 해커의 손에 들어갔을 경우입니다. 해커는 해당 비밀번호를 사전에 저장하게 됩니다.

해커의 사전에 저장된 비밀번호

이 비밀번호로 다른 사이트에 접속을 시도한다고 가정해 보겠습니다.

def dictionary_attack(word):
    dic = openpyxl.load_workbook('dic.xlsx')
    sheet = dic.active
    count = 0
    for i in sheet.rows:
        if i[0].value == word:
            print("비밀번호 : " + i[0].value)
            print("소요시간 : " + str(time.time() - start))
            count = 1
    if count == 0:
        print("해당 단어가 없습니다")

사전 공격 결과

아무리 안전한 비밀번호라도 같은 비밀번호를 여러 사이트에 사용하게 되면 유출의 위험이 커지고, 하나의 사이트에서 유출이 되면 모든 계정이 위험해지는 결과를 만듭니다.


4. 대처법

모든 사이트의 비밀번호를 전부 다르게 만드는것은 매우 힘든 일입니다. 그렇기 때문에 새로운 비밀번호를 만들지 않고 비밀번호에 여러 바리에이션을 추가하는 방법을 추천드립니다.

 

예를 들어 방금 만들었던 "MaR!$aRa11?"로 바리에이션을 만들어 보겠습니다.

  • 네이버(Naver) : NMaR!$aRa11?
  • 다음(Daum) : DMaR!$aRa11?
  • 구글(Google) : GMaR!$aRa11?
  • 넥슨(Nexon) : NEMaR!$aRa11?

이런 식으로 바리에이션을 만든다면 하나의 비밀번호가 유출돼도 다른 사이트의 비밀번호는 안전합니다. 또한 해커는 MaR!$aRa11?라는 단어는 사전에 존재하지 않으므로 이러한 바리에이션을 유추하는 것은 불가능합니다.


5. 결론

개인정보의 유출은 사용자가 아무리 노력해도 여러 이유로 일어날 수 있습니다. 하지만 위와 같이 비밀번호의 바리에이션을 통해 예방을 한다면 큰 피해를 막을 수 있을 것 입니다.

반응형