* 브런치에서 옯겨진 글 입니다.
얼마전에 또 모 사이트에서 개인정보가 털렸습니다.
개인적으로 다행인 것은 이미 털린 패스워드라는 것... (비번도 공공재...)
아무튼, 패스워드가 털린것에 대해 물어보시는 분이 있어서 이에 대해 설명을 적어보겠습니다.
우선 계정과 패스워드가 있습니다.
아이디 : 1Year
패스워드 : q1w2e3r4
1. 그대로 저장
q1w2e3r4가 서버에 그대로 저장되는 경우...드물게 그대로 저장되는 경우가 있습니다. 대부분은 옛날에 나온 서비스인데, 가끔은 비밀번호 찾기를 했을 때 비밀번호를 그대로 보내주는 쇼킹한 경우도 있습니다. 이런 경우 관리자는 모든 사용자의 비밀번호를 볼 수 있고, 털리면 끝. 그리고 저런식으로 저장된 경우 다른 보안 처리가 되어있지 않을테니 털려있다고 보셔도 됩니다. 사용하지 않는 것을 권장합니다.
가끔은 탈퇴를 해도 문제인데, 실제 사용자 계정을 삭제하지 않고 탈퇴 되었다고만 표시해두는 서비스들도 있습니다. 그래서 탈퇴 전에 비번을 이상한 것으로 변경한 후, 비밀번호 찾기 힌트가 있다면 그것도 변경한 후 탈퇴를 하시길 권장합니다.
2. 단방향 해시
단방향 해시가 뭐냐면, A에서 B를 만드는 식은 있지만 B에서 A를 만드는 식은 없습니다. 따라서 q1w2e3r4를 단방향 해시를 하면, 원래 패스워드를 알 수 없는 다른 문자열이 됩니다. 이렇게 변경된 값을 서버에 저장한 후 사용자가 로그인할 때 패스워드를 다시 해시를 한 후 서버에 저장된 B와 비교하여 패스워드 여부를 확인합니다. 패스워드 털렸다는 글 보면 가끔 sha, md5 같은 것을 볼 수 있는데 이게 단방향 해시 알고리즘입니다. (여러가지가 있어요.)
* q1w2e3r4를 md5 해시를 하면 c62d929e7b7e7b6165923a5dfc60cb56 이런 문자열이 됩니다.
언듯 생각하기엔 원래 패스워드를 만드는 식이 없으니 안전한 것 같지만, 그래도 B가 유출되면 원래 패스워드를 알 수 있는 방법이 있습니다.
위 사이트에 접속하신 후 c62d929e7b7e7b6165923a5dfc60cb56 를 입력하고 Crack hashes 버튼을 클릭하면 아래 그림과 같이 녹색 영역에 md5, q1w2e3r4로 패스워드를 볼 수 있습니다.
레인보우 테이블이라고 불리는데, 해시 된 값들을 미리 변환해두고 이 값을 통해 원래의 패스워드(A)를 찾을 수 있습니다. 모든 값을 만들 순 없지만 엄청나게 많은 값들이 해시되어 테이블이 만들어 져 있습니다.
따라서 이 방식으로 서버에 저장되어 있다가 패스워드가 유출됐다면 이 패스워드도 공공재라고 보시는 것이 좋습니다.
오래된 커뮤니티들이 이 방식으로 된 경우가 있습니다. 옛날 게시판들이 패스워드를 단순히 sha1이나 md5로 저장하는 경우가 많았는데, 사용자들에게 강제로 패스워드 업데이트를 요청하지 않으면 이를 그대로 사용할 수 밖에 없기 때문에 편의상 그대로 유지되는 경우가 왕왕 있습니다.
3. Salt & Pepper
2번의 방법으로 패스워드를 저장하면 두 사용자가 같은 패스워드를 사용할 때 같은 해시값이 저장됩니다. 아래와 같이 저장되겠지요.
ID : 1year
PASSWORD : c62d929e7b7e7b6165923a5dfc60cb56
ID : august
PASSWORD : c62d929e7b7e7b6165923a5dfc60cb56
이걸로 패스워드가 노출되었다고 할 순 없지만, 하나의 패스워드를 찾게 되면 같은 패스워드를 사용하는 모든 사용자의 패스워드가 털리는 문제가 있습니다.
그래서 모든 패스워드를 해시하기 전에 패스워드마다 임의의 문자열을 붙여서 해시를 하면 같은 패스워드를 사용하더라도 다른 해시값을 얻을 수 있어 더 안전합니다.
q1w2e3r4 + salt1 => d3050d463eb5e39e171fcbbaa02b3d9f
q1w2e3r4 + salt2 => 297cb436996a984e46bfc94ef53955a1
두 사용자 모두 q1w2e3r4를 패스워드로 사용하지만 salt에 따라 전혀 다른 값이 생성되기 때문에, 서로 같은 패스워드를 사용한 다는 것을 전혀 알 수 없습니다.
4. Key Stretching
그런데 이렇게 저장이 되어도 단방향 해시 함수는 속도가 빠르기 때문에, 찾으려고 마음을 먹으면 숫자로 된 자물쇠를 일일이 돌려봐서 비밀번호를 찾는 것 처럼 일일이 값을 대입해보면 결국 패스워드를 알 수 있습니다. 시간이 오래 걸리긴 하겠지만 GPU로 병렬처리를 하기도 하고, 특수한 하드웨어를 사용하기도 해서 이를 찾는 것이 가능한 수준이라고 합니다. 그래서 Key Stretching 과정을 통해 이를 오래걸리게 해, 레인보우 테이블을 만들기에도 어렵고, 무차별 대입 공격(Brute force attack)을 해서 찾기도 어렵게 합니다.
Key Stretching 은 해시된 결과를 다시 입력으로 사용하여 해시를 반복하는 것 입니다.
예를 들어
q1w2e3r4 + salt1
=> d3050d463eb5e39e171fcbbaa02b3d9f
=> 9c2fb0696a31340accbd853d20931de0
=> b5118ec21a5bd0cab03724cd4abcec8a
=> 2bf694be24c219f178db88dd7c4552e6
결과적으로 2bf694be24c219f178db88dd7c4552e6를 저장하면, 이 과정에서 횟수를 다르게 하여 연산 시간을 길게 만들면, 시간적인 제약이 생겨 레인보우 테이블이나 무차별 대입 공격 모두에 효과적인 방어를 할 수 있습니다. 물론 2~3회 하는게 아니고 엄청 많이합니다. (LastPass의 도움말에 보면, 이 횟수를 사용자가 변경할 수 있는데 기본값은 5000회로 되어 있는 것을 볼 수 있습니다.)
5. 결론
- 4번까지 되어 있으면 패스워드가 유출되어도 큰 위험은 없습니다. 다만 어떤 사이트가 어떻게 패스워드를 암호화 하고 있는지 알 수 없기 때문에 유출되면 털렸구나...하시는 것이 안전합니다.
- 기왕이면 사이트 별로 다른 패스워드를 사용하는 것을 권장하는데, 기억하기 어렵기 때문에 요즘에는 1password, lasspass와 같은 서비스를 많이들 사용하시는 것 같습니다. (그런데 가끔 얘네가 털리기도 해요.)
- 저는 안전한 사이트, 커뮤니티, 일반 사이트 등 몇가지 등급으로 나눠 등급별로 같은 패스워드를 사용하고, 사이트별로 일정한 규칙으로 prefix, suffix를 붙여서 사이트별로 다른 패스워드를 사용합니다. 한번 털리면 그 패스워드 찾아 바꾸기 너무 귀찮아서 털리면 그 사이트만 변경하면 되도록 하려구요. 앞으로는 지금까지보다 더 자주 털릴테니까요!
6. 쓰고 보니 일반인을 위한 글이 이미 있네요
7. 더 자세한 내용들이 많으니 관심 있으신 개발자 분들은 읽어보세요
d2.naver.com/helloworld/318732
https://crackstation.net/hashing-security.htm
'토막 정보' 카테고리의 다른 글
고급 보호 프로그램과 구글 드라이브 (0) | 2022.01.04 |
---|---|
우분투 버전 확인 (0) | 2021.12.23 |
음식물처리기 스마트카라 PCS-350 주의사항! (0) | 2021.12.18 |
애드센스 전면광고(vignette ads)에 당황하지 말자 (0) | 2021.01.23 |
개발자를 위한 타이포그래피 (0) | 2021.01.03 |
댓글