보안/정보

개인정보 보호방법) 1. 비밀번호는 길고 복잡하게

마리사라 2021. 2. 27. 16:40
반응형

저번 게시글에서 개인정보의 정의와 개인정보를 지키는 가장 기본적인 방법에 대해서 알려드렸습니다. 이번에는 개인정보라고 하면 가장 먼저 떠오르는 비밀번호에 대해서 글을 써보고자 합니다.


1. 비밀번호

위키백과에서는 비밀번호의 정의를 다음과 같이 내리고 있습니다.

비밀번호(秘密番號) 또는 패스워드(password), 암호(暗號, 문화어: 통과암호)는 어떤 사용자가 특정의 자원 또는 리소스(resource)에 접근 또는 제한을 통과할 수 있는 권한을 얻기 위해 제시해야 하는 미리 정해진 문자열 또는 숫자열등의 정보이다.

표준국어대사전에서는 비밀번호의 정의를 간단하게 다음과 같이 내리고 있습니다.

은행이나 컴퓨터 시스템 따위에서, 보안을 위하여 미리 약정하여 쓰는 개인 고유의 문자열.

즉, 비밀번호는 사용자가 보안을 위하여 접근이나 제한을 통과할 수 있는 권한을 얻기 위해 사용하는 고유의 정보라고 할 수 있습니다.

 

그렇기 때문에 비밀번호는 일반적인 사이트에 접속하는 문자열로 된 비밀번호뿐 아니라, 스마트폰의 잠금을 해제하기 위해 사용하는 PIN, 패턴, 지문, 얼굴인식 등도 비밀번호라고 할 수 있습니다.


2. 비밀번호를 길고 복잡하게 해야하는 이유

네이버) 회원가입 시, 비밀번호 생성 조건

요즘 비밀번호의 최소 길이는 8자 입니다. 또한 단순히 숫자만이나 영문 소문자만 사용하여선 안되고, 영문 대 소문자, 숫자, 특수문자를 모두 사용하여 만들어야 합니다. 과거에는 그저 6자리 이상만 되면 됐는데, 왜 이렇게 변했을까요?

 

무어의 법칙 (출처 : 위키백과)

컴퓨터 용어로 무어의 법칙이라는 말이 있습니다. 무어의 법칙의 가장 큰 내용은 "18개월 마다 컴퓨터의 성능은 2배가 되며, 가격은 절반이 된다."입니다. 과거에 비해서 오늘날의 컴퓨터는 엄청난 속도로 발전해 왔으며, 윈도우 97, 98이나 XP를 사용하던 시절에 비해 우리는 비교도 안 되는 성능의 컴퓨터를 사용 중입니다. 극단적인 예시로, 대부분의 컴퓨터보다 성능이 낮은 스마트폰이 NASA에서 인간을 달로 보냈던 아폴로 11호에 사용된 슈퍼 컴퓨터보다 높은 성능을 가졌습니다.

 

이것이 문제가 되는 이유는, 비밀번호를 컴퓨터의 힘으로 풀어낼 수 있기 때문입니다. 암호화되지 않은 비밀번호는 무차별 대입법(브루트 포스)를 이용해 쉽게 풀어낼 수 있고, 과거의 암호화 방식으로는 가정용 컴퓨터로도 몇 시간 안에 풀어낼 수 있습니다.

 

Python을 통해 비밀번호를 풀어내는 예시를 들어보겠습니다.

password = "123456789"

예를 들어 과거의 비밀번호처럼 숫자로만 이루어진 비밀번호 '123456789'가 있다고 해보겠습니다.

number = "0123456789"

숫자는 0부터 9까지 10가지의 가능성을 가지며, 9자리의 숫자를 만드는 방법은 10^9(10억)개가 있습니다.

possibility = number
to_attempt = product(possibility, repeat=len(password) - 1)


def calculate(first):
    for attempt in to_attempt:
        if str(first + "".join(attempt)) == password:
            print(str(first + "".join(attempt)))
            print(time.time() - start)


if __name__ == '__main__':
    procs = []

    for index, first in enumerate(list(possibility)):
        proc = mp.Process(target=calculate, args=(first,))
        procs.append(proc)
        proc.start()

    for proc in procs:
        proc.join()

이를 파이썬의 itertools 모듈을 통해 모든 경우의 수를 만들고, multiprocessing 모듈을 통해 다중 연산으로 해당 비밀번호가 나올 때까지 계산합니다. 이는 컴퓨터의 성능에 따라 다르지만, 저는 약 45개 정도의 프로세서로 다중 연산합니다.

 

프로그램 실행 결과

다른 언어보다 느린 파이썬으로도 9자리의 비밀번호를 맞추는데 약 12초가 걸렸습니다. 파이썬보다 평균 150배 정도 빠른 C언어로 계산한다면 0.1초도 안 걸려서 풀리게 됩니다.

자릿수를 늘려서 실행한 결과

비밀번호가 10자리가 되어도 상황은 비슷합니다. 파이썬에서는 120초 정도가 걸렸지만, C언어에서는 그래도 1초도 안 걸리는 시간에 풀릴 수 있다는 뜻입니다. 그렇기 때문에 숫자로만 비밀번호를 만드는 것은 크게 의미가 없습니다.

 

이번에는 영어 소문자와 숫자로만 만들어 보겠습니다.

number = "0123456789"
lowercase = "abcdefghijklmnopqrstuvwxyz"
possibility = number + lowercase

알파벳은 총 26글자이므로, 가능성은 26 + 10 = 36으로, n^36개의 가능성을 갖습니다.

 

password = "sara1234"

만약 위와 같은 비밀번호가 있다고 가정하겠습니다. 36^8은 10^8승보다 약 2만 6천 배 많기 때문에 예상 소요시간은 

영문 + 숫자의 예상 소요시간

이는 약 87시간 정도 소요될 것으로 예상되며, 이를 C언어로 하게 된다면 약 30분 만에 계산이 완료됩니다. 그렇기 때문에 8자리의 소문자 + 숫자는 보안에 취약합니다.

 

같은 원리로 영문 대문자 + 영문 소문자 + 숫자의 경우에는 약 2300시간(C언어 15시간), 영문 대문자 + 영문 소문자 + 숫자 + 특수문자(16가지)의 경우에는 36200시간(C언어 241시간)으로 올라갑니다. 이 모든 계산은 최상의 경우를 가정한 계산이며, 상황에 따라 몇백 배에서 몇천 배 까지도 늘어날 수 있습니다.

 

물론, 가능한 조합으로 모든 경우를 시도하는 방법은 대부분의 인터넷 사이트에서는 불가능합니다. 대부분의 사이트에서는 5번에서 10번 정도 비밀번호 입력 오류가 발생하면 아이디를 잠가버리기 때문에 이러한 방식은 실제 해킹에서는 거의 사용되지 않는 방식이라고 할 수 있습니다.


3. 그럼에도 비밀번호를 길고 복잡하게 해야 하는 이유

암호화

비밀번호는 인터넷 상에서 전송될 때 암호화되어 전송됩니다. 대표적인 암호화 방법인 RSA-2048의 경우, 617자리의 숫자로 암호화되어 전송됩니다. 10^617승을 계산하는 것은 전 세계의 컴퓨터를 모두 끌어와도 불가능하기 때문에 세계 표준으로 자리 잡을 수 있었습니다. 하지만 비밀번호가 8자리의 숫자로 이루어졌다면 가능한 모든 경우의 수를 Python을 기준으로도 12초 만에 만들 수 있고, 이를 RSA-2048로 변환하여 같은 값이 나오게 된다면, 비밀번호가 유출된 것입니다.

 

이 방식은 사이트에 직접 비밀번호를 입력하는 시도를 하는 것이 아니기 때문에 사이트에서 미리 감지하고 차단할 수 없습니다. 따라서 비밀번호를 만들 때부터 복잡하고 길게 만드는 것이 비밀번호 유출의 위험에서 조금이라도 벗어날 수 있는 방법이라고 할 수 있습니다.

반응형