비밀번호 관리

나를 비롯한 수많은 사용자들은 두세가지의 비밀번호를 가지고 여러 웹사이트를 관리한다. 이는 순전히 편의성을 위해서이며 만약 어떤 웹사이트가 특수문자와 같이 좀 특별한 것을 요구할 경우 첫 글자를 대문자로 시작하거나 마지막에 느낌표를 붙히는 간단한 방법으로 넘어간다. 사실 이 방법은 비밀번호 보안에는 매우 해롭고 꼭 고쳐야 되는 습관이다.

비밀번호의 보안에는 두가지가 중요한데 첫번째는 복잡성이다 (엔트로피). 가장 단순하게 비밀번호를 푸는 방법으로는 무차별 대입 (Brute-Force) 방법이 있는데, 만약 비밀번호가 4자리 숫자라면 0000부터 9999까지 전부 대입하는 것을 의미한다. 웹사이트들은 주로 캡챠나 대기시간을 두어 무차별 대입법에 시간이 엄청나게 소요되게 만듦으로써 막는다. 이는 매우 효과적이지만 너무 이것을 믿으면 안된다. 몇년전 크게 이슈화 됐던 할리우드 아이클라우드 사진 유출 사건도 해커가 유명인의 이메일을 입수한 뒤 무차별 대입방법으로 비밀번호를 찾아내어 일어난 일이라고 알려져있다.

비밀번호를 복잡하게 만드는 방법은 두가지가 있는데 첫번째는 길이고 두번째는 문자의 종류이다. 다만 특수문자, 숫자등을 포함시켜서 문자의 종류를 늘린다면 사람으로서는 햇갈리기 때문에 단순한 단어들의 조합으로 간단하지만 길게 만드는 방법을 전문가들은 추천한다. 이 경우 쉽게 기억이 되기 때문에 여러 웹사이트에서 까먹지 않고 쓰일 수 있다.

Password Strength

비밀번호 보안의 두번째는 중복성이다. 비밀번호 중복의 문제점은 하나가 해킹되면 다른 하나 역시 뚫린다는 문제이다. 하지만 비밀번호가 중복은 원칙적으로는 문제가 없다. 사이트는 비밀번호를 그대로 저장하지 않고 salt와 hash라는 방법을 이용한다. Hash를 간단히 설명하자면 문자열로 부터 랜덤한 문자열를 얻어내는 방법이라고 생각하면 된다. 입력값이 같다면 결과는 언제나 동일하지만, 다른 입력값으로 같은 결과를 얻어내기는 불가능하며, 결과를 보고 입력값을 추측하는 것도 불가능하다. 회원이 웹사이트를 가입할 때 서버는 랜덤한 문자열(salt)를 만들어내고 salt와 비밀번호를 둘 다 hash함수에 집어 넣고 결과값을 구한다. 이 salt와 hash 결과값을 비밀번호 대신 서버에 저장한다. 나중에 회원이 로그인 할 경우 입력된 비밀번호와 salt를 hash 함수에 집어넣어 저장된 hash와 값이 다른지 같은지 비교를 통해 비밀번호가 맞은지 틀렸는 지를 확인한다.  hash함수는 입력값이 다르면 출력값이 다르기 때문에 (collision이 거의 불가능 하다) 맞는 비밀번호가 아니면 hash값이 같을 수 없다. 이런 방법으로 비밀번화 관리를 할 경우 서버에는 비밀번호 평문(plain text)은 저장되지 않기 때문에 나중에 데이터베이스 유출이 되더라도 비밀번호 유출의 문제는 없다. 즉  password123이 유출이 되는 것이 아니라  p!dfE3[dE와 같은 의미없는 hash값이 유출이 된다.

하지만 이 방법은 웹사이트 내부의 방법이기 때문에 개인 유저의 경우 웹사이트가 hash를 사용해 비밀번호를 저장하는지 평문 그대로를 저장하는지 아는 것은 불가능하고 설마 그대로 저장하겠어 라는 믿음 하나로 살아야 된다. 만약 평문으로 저장되고 이것이 유출 된다면 거의 모든 웹사이트들이 해킹당하는 위험이 있다. 비밀번호가 아무리 복잡하도 평문이 유출된다면 다른 웹사이트의 해킹은 식은 죽 먹기이다.

작년에 일어난 Cloudbleed 사건은 서버가 비밀번호를 hash를 통해 저장했음에도 불구하고 cloudflare의 문제 떄문에 평문이 유출되는 사건이 일어났다. 뿐만 아니라 만약 인터넷 통신이 암호화 되어있지 않다면(http) 비밀번호는 그대로 패킷에 담겨 보내지게 되고 이 역시 위험하다.

결국 비밀번호를 가장 안전하게 쓰는 방법은 적당히 길고 복잡한 비밀번호를 사이트들 마다 다르게 사용하는 것이다. 물론 사이트마다 비밀번호를 다르게 사용하는 것은 실질적으로 매우 힘들며 따라서 비밀번호 관리자를 사용하여 해결한다. 크롬을 쓸 때 비밀번호를 저장하는 것도 비밀번호 관리자로 볼 수 있다. 이 경우 비밀번호는 아무거나 막쳐도 기억은 관리자가 해주기 때문에 문제가 없다. 하지만 비밀번호 관리자의 가장 큰 문제는 관리자가 해킹당할 경우 모든 비밀번호가 유출이 될 수 있다는 것이고 실제로 1Password라는 비밀번호 관리자 사이트는 Cloudbleed 사건에 영향을 받았다.

어떤 사람들은 비밀번호 끝에 로그인 사이트 이름을 붙혀서 관리하라고 한다. 예를들어 구글에 로그인 할경우 pass123google, 페이스북에 로그인 할 경우 pass123facebook. 이 방법의 문제점은 비밀번호가 사이트마다 다르긴 해도 사람이 보기만 하면 바로 다른 웹사이트의 비밀번호를 알아낼 수 있다는 점이다.

해결 방법은 간단하다 pass123google을 hash 함수에 집어넣고 이를 비밀번호 평문으로 사용하면 된다. 이 결과물은 pass123facebook의 결과와 무척 다르기 때문에 해커가 비밀번호 평문을 얻어 내었다고 해도 이것 자체가 hash기 때문에 다른 비밀번호를 추측해내기는 불가능하다.

아래는 내가 만든 hash 비밀번호 생성기이다. 마스터 비밀번호와 웹사이트 url을 집어넣으면 두 문자열을 합친뒤 SHA3 512 함수에 집어넣어 얻은 결과를 약간의 refining을 통해 출력하고 이 비밀번호를 로그인시 사용하면 된다. hash 함수는 클라이언트에서 계산이 되기 때문에 어떤 정보도 밖으로 새지 않아 안전하다. 입력값이 같으면 결과는 언제나 동일하기 때문에 마스터 비밀번호를 까먹지 않는한 잊어버릴 수 없다.

https://jjhoon713.github.io/hashedpassword/