보안뉴스

23.07.26 "@넣었는데도 털렸다"…비번 설정, 뭐가 잘못됐던 걸까?

마준123 2023. 7. 27. 01:03

이 내용은 노션에서 작성되어서 가독성이 구립니다.

노션에서 보시는걸 추천드립니다.

노션 주소 : https://robust-millennium-8ba.notion.site/6f8e366f8ef04b98915976322fc7c8cb?pvs=4

 

"@넣었는데도 털렸다"…비번 설정, 뭐가 잘못됐던 걸까? : 네이트 뉴스

위 기사에서는 아래와 같은 내용이 작성되어있다.

<aside> 💡 커뮤니티에선 특수문자인 !,@,#,$,% 등을 포함한 비밀번호 설정을 요구했다. A씨는 주로 사용하는 비밀번호 끝에 !와 @를 붙였고, 사이트에서도 이를 '보안 강도 높음'으로 분류했다. 그런데 뭐가 문제였을까.

</aside>

문자 구성에 대해 말하는 걸 보면 해당 보안 강도 높음의 의미는 아마 브루트포스(brute force) 즉, 무차별 대입 공격을 대상으로 말하는 보안 강도 일 것이다.

하지만 요즘은 비밀번호 규칙이 굉장히 까다로워졌으며 N회 이상 틀린 비밀번호를 입력할시 캡차,비밀번호 초기화,로그인 대기시간 등의 방법을 사용해서 사실상 서비스에 직접적인 브루트포스 공격은 쉽지가 않다.

그리고 직후에는 아래와 같은 문장이 나온다.

<aside> 💡 이처럼 웹사이트, 사회관계망서비스(SNS)를 이용하다 보면 심심찮게 계정을 해킹 당한 사례를 볼 수 있다. 이미 유출되거나 사전에 탈취한 사용자 계정(ID)과 비밀번호를 다른 사이트에 마구 대입하는 '크리덴셜 스터핑' 공격에 의해 발생하는 경우가 많은데, 이런 공격은 안전한 비밀번호를 만들어 사용하는 것 만으로도 예방이 가능하다.

</aside>

크리덴셜 스터핑(Credential stuffing)은 일반적으로 사람들이 여러 사이트를 이용하면서 같은 ID와PW를 사용하는 심리를 이용한 공격이다.

만약 피해자가 해킹에 취약한 사이트에 가입했을 때, 그곳의 DB만 털면 피해자의 다른 사이트의 계정도 알아 낸 것이나 마찬가지 이기 때문이다.

그러면 내가 설정한 복잡한 비밀번호는 외우기도 어렵고 귀찮기만한데 보안 어쩌구 하는놈들이 가용성을 떨어뜨리면서까지 내 비밀번호를 이따구로 만들어 놓은건 쓸모없는 짓일까?

다행스럽게도 그건 아니다.

보통 DB를 털게되면 비밀번호가 얌전하게 들어있지않고 hash화 되어서 저장이 된다.

hash는 간단히 말하자면 암호화해서 값을 저장한다고 생각하면된다.

그래서 과거엔 비밀번호 찾기가 있었지만 hash값으로 비밀번호를 저장한 이래 찾기는 불가능하고 변경 만 가능 해졌다.

개발자와 서버도 hash값만 알고 비밀번호를 모르니 당연하다.

암호화를 했으면 복호화를 하면되지 않나?

개발자와 서버도 복호화를 할 수 없다.

일방향 암호화 이기 때문이다.

어떻게 그런게 존재할 수 있을까?

간단하게 미분, 적분을 생각하면 좋을 것 같다.

$x^2+x+1$을 미분하면 $2x+1$ 이된다.

적분은 미분의 반대라고한다.

$2x+1$을 적분하면 $x^2+x+C$ 가 된다.

반대라고는 하지만 실제 똑같은 값이 나오지는 않는다.

때문에 복호화가 불가능하다.

(미분 자체가 hash화 라는 뜻은아니다, hash는 내가 감히 이렇게 설명해도 되나 싶을정도로 종류별로 방법이 다르고 복잡할꺼다, 하지만 이 문서에서는 hash를 미분이라고 보겠다.)

그래서 어쩌라고?

여기서 브루트 포스가 나온다.

만약 내 비밀번호가 $x^2+x+1$ 일경우 DB에는 $2x+1$으로 저장 돼 있을 것이다.

그러면 해커는 여기서 포기할까?

아니다 이미 hash값을 알아 낸 이상 위에서 말한 ‘N회 이상 틀린 비밀번호’ 장치에 영향을 받지 않는다.

해커의 컴퓨터에서 수많은 비밀번호의 미분값을 계산하고 $2x+1$와 같은 비밀번호를 찾는다면 비밀번호가 뭔지 알아낼 수 있다.

<aside> 💡 $x^2+x+1$ 과 $x^2+x+2, x^2+x+3$ 등의 미분값은 셋다 같다. 미분과 hash는 같은 내용은 아니지만 이러한 특징도 일치하는 부분이 있다. 바로 hash collision(해시충돌) 이다. hash값은 도출되는 글자수가 정해져있기 때문에 이러한 일이 발생되는 것인데 직접 찾아보시길 권한다. 어쨋든 이로써 브루트포스에 오히려 도움을 줄 수도 있다. (input 값이 달라도 hash값만 같으면 되기 때문.)

</aside>

때문에 이 시점의 브루트 포스를 방해하기 위해서 비밀번호를 복잡하게 설정해야 한다는 것이다.

<aside> 💡 우선, 안랩은 비밀번호 뒤에 '!' 혹은 '#'과 같은 특수 문자를 붙였다고 안심하면 안된다고 당부했다. 해커들은 이미 이런 비밀번호 패턴을 파악해 찾기 때문이다.

</aside>

읽다보면 이런 내용도 나온다.

이건 뭔소릴까?

hash의 원래값을 찾기위해 브루트포싱해주는 hashcat,존더리퍼 등의 툴이 있다.

(나는 hashcat만 써보았다.)

사람들은 KISA에서 권고하는 비밀번호 규칙인

"세가지 종류 이상의 문자구성으로 8자리 이상의 길이로 구성된 문자열" 또는 "두가지 종류 이상의 문자구성으로 10자리 이상의 길이로 구성된 문자열"

( 대부분 전자가 사용된다.)

이라는 조건에 부합하기위해 보통 첫번째는 대문자, 중간에는 소문자, 마지막엔 특수문자 를 이용해 비밀번호를 만든다.

그러면 Aabcdef! 등의 비밀번호가 만들어지는데 이럴경우 사실상 abcdef 부분의 6자리 브루트포스나 마찬가지 인 셈이다.

이러한 사람들의 심리를 이용해 hashcat 등은 앞자리에 대문자와, 맨 뒷자리에 !,@ 를 탑재하여 브루트 포싱을 진행한다.

물론 이 과정에서 성능좋은 CPU와GPU가 필요하다.

내가 프로젝트 당시 우리 팀원이 내가 실제 쓰는 비밀번호와 거의 흡사한 형태를 hashcat으로 돌렸더니 1시간정도 이후에 풀어버렸다. ( sha256으로 암호화 하였다.)

그래서 뭐 어쩌라고?2

결론은….크리덴셜 스터핑에서 브루트 포스가 연계될 확률이 높으므로 비밀번호를 복잡하게 만드는게 좋다…

아래는 내가 생각한 안전한 비밀번호다.

  1. 해당 사이트의 이름을 섞은 비밀번호.
    1. 해당 기사에 나온다, 박찬암씨도 했던말이며 기본적으로는 크리덴셜 스터핑을 방어하기 위한 방법이다.
  2. 대문자는 여러개를 섞던가 맨앞에 쓰지 않는다.
    1. 여러개를 쓰는게 좋을 것 같다.
  3. 특수문자는 !,@ 보다 다른걸 많이 활용하고 여러개를 넣는다.
  4. 가능한 길게 만든다.
    1. 특정 대상을 노린 공격이 아니라 크리덴셜 스터핑의 대상이라면 더더욱 필요한 방법이다.
    2. 해커는 누군가 아무나의 비밀번호가 필요한거지 가난한 당신의 비밀번호는 필요 없을 확률이 높다. 때문에 남들과 다른 당신 한명의 비밀번호 때문에 hashcat의 옵션을 바꿔서 돌릴 것 같지는 않기 때문..

사실 나도 비밀번호를 이렇게 만들지는 않는다.

하지만 자기가 정말 중요한 정보를 많이 갖고있는 사람이라면 비밀번호를 튼튼하게 만들어서 나쁠건 없다고 생각한다.

끝!

잘 쓰지도 못하고 긴 글 읽어주셔서 감사합니다.