불륜 권장 웹 사이트 애슐리매디슨 1천500만 개, 성인 웹 사이트 3억 3900만 개, 야후 5억만 개 등 여기저기서 도난당한 비밀번호가 수 없이 쏟아진다. 물론 일반 텍스트로 저장되어 보안에 아주 취약한 경우도 있지만 암호화를 했는데도 문제는 여전히 남아있다. 만약 그들이 비밀번호를 훔쳐갔더라도 읽을 수 없다면 문제가 되지 않았을 것이다. 하지만 암호화가 무색하게도 비밀번호는 평문으로 저장된 것처럼 찾아낼 수 있다. 그들은 입력된 비밀번호가 맞는지 확인하는 ‘해시(hash)’를 통해서 그리고 그들만의 트릭을 이용해서 비밀번호를 찾아낸다.
어떻게 보면 그들도 좋은 암호 알고리즘을 사용했었을 수도 있다. 문제는 입력된 비밀번호가 맞는지 비교할 때 사용되는 해시의 목록이다. 해싱은 암호가 잘못 사용되지 않도록 수학적으로 변환하여 임의의 문자열로 바꾸는 과정을 말하며 임의의 문자열은 ‘해시(hash)’라 일컫는다. 또한, 하나의 문자열을 보다 빨리 찾을 수 있도록 주소에 직접 접근할 수 있는 문자열로 사용되기도 한다. 기본적으로 흩뜨려 놓는다는 의미도 있어 이런 특성 때문에 전자 서명 알고리즘에서나 암호화 및 복호화에서도 사용된다.
그러나 이러한 해싱의 용도나 특징 때문에 해커는 해시에 접근하여 비밀번호를 유추할 수가 있다. 이를 패스워드 해싱(Password Hashing)이라 한다. 즉, 아무리 암호화를 잘했다고 해도 비밀번호 해시 목록이 유출되면 문제가 될 수 있다. 이를 통해 권한 없는 사용자의 비밀번호를 유추하여 로그인 하거나 관리자 같은 중요한 계정에 접근하여 로그인할 수 있을 것이다. 또한, 일반적으로 한 웹 사이트에서 사용된 비밀번호는 다른 웹 사이트에서 비밀번호로 사용될 가능성이 커 비밀번호가 유출된다는 것은 상당한 타격이 있다.
해시는 일방향 함수로 작동된다. 이 말은 쉽게 해싱할 수 있지만 사실 뒤집어서 풀기에는 어려운 수학연산이라는 것이다. 해시도 다른 형태의 암호화와 마찬가지로 읽을 수 있는 데이터를 완전히 흩뜨려놓은 암호로 변환한다. 그러나 암호화된 데이터는 누군가가 특정 키를 사용하여 해독하도록 허용하지만 해시는 해독하도록 설계되지는 않았다. 대신에 웹 사이트에 비밀번호를 입력하면 비밀번호의 해시 값을 확인하여 중요한 비밀번호는 저장하지 않고도 비밀번호의 유효성을 확인하는 용도로 사용된다.
해시 크래킹 소프트웨어인 hashcat를 만든 jens ‘Atom’ steube는 해시는 일반적으로 입력을 받아서 처리하며, 무작위 데이터처럼 보이는 것은 나오지 않는다고 말한다. 동일한 데이터를 다시 입력하면 나오는 데이터는 완전하게 같다는 것이다. 이런 특성을 통해 비밀번호를 구분할 수 있고 사용자의 입력이 정확하다는 것을 확인할 수 있다.
이론상으로는 해커나 혹은 다른 누구도 해시를 가져와서 비밀번호를 다시 변환할 수 없어야 한다. 하지만 실제로는 이런 이론을 깨버린다. 물론 일부 해싱으로 비밀번호를 되돌리는 것은 어렵지만 가능은 하다. 실제로 야후나 성인 사이트 해킹 사건에서 계정을 도난 당하면서 비밀번호도 함께 도난 당했다. 당시 두 회사에서는 SHA1이라는 간단한 해싱 알고리즘을 사용하여 패스워드를 보호하고 있었다. SHA1은 취약한 보안 알고리즘 하나로 이 알고리즘을 이용하여 해시화된 비밀번호 중 웬만한 것은 해독할 수 있다. 이로 인해 유출된 비밀번호가 암호화되어 있어도 비밀번호를 추측할 수 있을 뿐만 아니라 다른 웹 사이트의 계정에도 접근할 수 있을 가능성이 높다.
SHA1과 반대로 크라우드 펀딩 사이트인 Patreon은 지난해에 ‘비크립트(bcrypt)’라는 새로운 해싱 암호를 발표했다. patreon에서 발표한 새로운 해싱 기법을 사용하면 지금보다 전체 해시 목록을 안전하게 보호할 수 있다. 매년 데프콘 비밀번호 크래킹 대회에 참여하고 있는 KoreLogic의 릭 레드먼(Rick Redman)에 따르면 해시의 가장 큰 특징은 예방 수단이라는 것이다. 비밀번호가 유출되고 해커가 해시를 통해 비밀번호를 알아내기까지 사용자가 비밀번호를 바꿀 수 있는 시간을 벌어준다는 것이다. 더불어 만약 그 해시 알고리즘이 SHA1이었다면 그럴 기회도 없었겠지만 만약 그것이 비크립트라면 분명하게 비밀번호를 바꿀 수 있는 시간을 벌어다 줄 것이라고 확신했다.
비크립트가 기존의 해시 알고리즘과 다른 점은 해시 크래킹 하는 방식을 고려한다는 것이다. 물론 해커는 SHA1으로 해시 된 비밀번호를 되돌릴 수 없다. 그렇지만 단순하게 암호를 추측하고 암호를 실행해 볼 수 있다. 일치하는 해시를 찾게 되면 올바른 비밀번호를 입력했다는 것을 알 수 있을 것이다. 해시 크래킹 프로그램은 많은 해시 데이터베이스를 가지고 있고 이를 토대로 수백 만개 또는 수십 억개의 암호를 추측할 수 있다. 더불어 자동으로 훔친 해시 데이터 목록을 해시 데이터베이스와 비교하여 일치하는 항목을 찾아준다.
이러한 패스워드 크랙 작업은 불법이 아니다. 오히려 합법적인 로그인 시스템과 같은 기능을 수행한다. 입력된 비밀번호에서 나온 해시와 저장된 해시를 비교하여 일치했을 때 정확한 암호임을 확인하는 것이다. 즉, 해시의 존재성이 비밀번호를 증명하는 것처럼 이러한 작업을 다른 프로그램이 해도 오히려 문제가 될 것은 아니라는 것이다.
많은 이들이 수십 년 동안 해킹에서 해시를 보다 안전하고 효율적으로 작동할 수 있도록 노력해왔다. 일반 컴퓨터 프로세서나 CPU에서 그래픽 프로세서 또는 GPU로 전환하면 패스워드 크래커가 여러 가지 간단한 작업을 병렬로 수행할 수 있는 능력을 활용하여 추측을 수천 배까지 가속화 할 수 있다. 이른바 해시 크래커들은 ‘무지개 테이블(Rainbow table)’을 개발했다. 이는 암호의 해시를 사전에 계산해 놓은 어마어마한 해시 목록이다. 또한, 단순히 암호를 임의로 추측하는 것이 아니라 ‘사전공격(dictionary attacks)’을 통해 실제 단어나 이전에 있었던 비밀번호들의 공통적인 암호들을 모아 자주 쓰이고 더 많이 통용되는 문자열 차례대로 탐색한다. 이러한 비밀번호를 분석하여 새 비밀번호의 패턴을 찾고 더 빠르게 추측할 수 있다.
이처럼 패스워드 크래킹은 미묘하지만 계속해서 발전해왔다. 이런 공격과 더불어 사전 공격을 방어하기 위하여 해시는 ‘솔팅(salting)’이라 불리는 보호 알고리즘을 사용하고 있다. 솔팅이란 해시를 하기 전에 임의의 데이터 값을 비밀번호에 추가하여 해시화 하는 것으로 해시와 함께 솔트, 추가된 값을 함께 저장한다.
또한, bcrypt나 Argon2와 같은 현대의 해싱 기법은 단순하게 SHA1과 같이 달랑 암호만 해시화 하는 것이 아니라 해싱한 결과 값을 다시 해싱하면서 계속해서 수천 번을 해싱한다. 이러한 기능을 사용하려면 데이터가 메모리에 저장되어야 하고 다시 접근할 때 병목 현상이 발생하여야 한다. 이는 각 단계에서 메모리에 접근하지 않는다면 GPU도 여러 병렬 작업을 할 수 없기 때문이다.
비밀번호를 도난 당한 후에는 누출된 비밀번호가 얼마나 안전한지는 판단하기 어렵다. 보통 회사에서는 자신들이 사용하는 암호화 알고리즘을 공개하지 않을뿐더러 그들이 사용한 암호화 알고리즘이 얼마나 튼튼한 알고리즘인지 확인할 길이 없기 때문이다. 그러므로 사실상 누출된 비밀번호는 생각보다 더 취약하고 이미 공개되었다고 봐도 무방하다 생각된다. 애슐리매디슨 해킹 사건에서도 누출된 비밀번호는 3,600만 건으로 비크립트로 해싱되었다. 하지만 1천 5백만 건이 훨씬 약한 기법으로 해싱되어 회사 서버에 저장되어 있던 수십억 건의 비밀번호가 수일 만에 1,100만 건의 패스워드로 파생시킬 수 있다. 이 말인즉슨 암호화 알고리즘을 믿지 말고 결국에는 비밀번호의 보안은 사실상 사용자 하기에 따라 달려있다는 것이다.
비밀번호를 설정할 때는 해시 크랙 프로그램으로 추측하기 힘든 복잡하고 어려운 비밀번호를 사용해야 한다. 또한, 해킹당한 비밀번호는 다른 사이트에서 다시는 사용하지 않고 해킹사건이 일어났을 경우와 상관없이 주기적으로 비밀번호를 바꿔줘야 안전하다.
2부 보러가기