본문 바로가기
Wellbing

온라인 서비스에서 비밀번호를 저장하는 방법과 유출 또는 해킹 시 피해를 최소화하는 방법

by 바이탈하모니 2023. 10. 17.

보안의 초석인 비밀번호 저장
온라인 서비스에서 사용자 비밀번호를 저장하는 방법과 유출 또는 해킹 시 피해를 최소화하는 방법을 알아보세요.

21세기 1분기의 끝자락에 접어든 지금, 사용자 비밀번호가 디지털 금과 같으며 이를 보호하는 것이 데이터 보안과 개인 정보 보호의 핵심 요소라는 사실은 누구나 알고 있을 것입니다. 하지만 그럼에도 불구하고 모든 기업이 비밀번호를 제대로 보관하고 있는 것은 아닙니다.


이번 포스팅에서는 사용자 비밀번호를 저장하지 않는 방법과 보안을 중요하게 생각하는 서비스에서 어떤 방법을 사용하는지 살펴봅니다.



잘못된 방법: 비밀번호를 일반 텍스트로 저장하기


가장 간단한 방법은 암호화되지 않은 데이터베이스에 비밀번호를 저장하는 것입니다. 사용자가 로그인을 시도할 때 입력한 정보와 데이터베이스에 있는 정보를 대조하기만 하면 인증이 완료됩니다.


하지만 공격자가 데이터베이스 소프트웨어의 취약점을 악용하는 등 어떤 식으로든 데이터베이스를 훔칠 수 있는 위험은 항상 존재합니다. 또는 높은 액세스 권한을 가진 악의적인 직원이 비밀번호 테이블을 도난당할 수도 있습니다. 또한 유출되거나 가로챈 직원 자격 증명이 비밀번호를 훔치는 데 사용될 수도 있습니다. 간단히 말해, 일이 꼬일 수 있는 시나리오는 무수히 많습니다. 기억하세요: 오픈 형식으로 저장된 데이터는 바로 그 자체로 오픈 데이터입니다.


조금 더 나은 방법: 암호화된 비밀번호


비밀번호를 암호화된 형태로 저장하면 어떨까요? 언뜻 보기에는 나쁘지 않은 생각이지만 실제로는 잘 작동하지 않습니다. 암호화된 비밀번호를 데이터베이스에 저장하면 사용자 입력과 비교하기 위해 매번 암호를 해독해야 하기 때문입니다.


즉, 암호화 키가 가까운 곳에 있다는 뜻입니다. 그렇다면 이 키는 비밀번호 데이터베이스와 함께 해커의 손에 쉽게 넘어갈 수 있습니다. 사이버 범죄자가 이 데이터베이스를 빠르게 해독하여 일반 텍스트로 된 비밀번호를 얻을 수 있게 되므로 결국 원점으로 돌아가게 됩니다.


암호학자들이 진지하게 농담하듯이 암호화는 데이터 프라이버시 문제를 해결하는 것이 아니라 안전한 키 저장의 문제일 뿐입니다. 위험을 줄일 수 있는 몇 가지 교묘한 방법을 생각해낼 수는 있지만, 일반적으로 이러한 방식으로 비밀번호를 안정적으로 보호하는 것은 불가능합니다.

 



올바른 방법: 비밀번호 해시 저장


가장 좋은 방법은 비밀번호를 전혀 저장하지 않는 것입니다. 무언가를 가지고 있지 않다면 도난당할 수 없겠죠?


하지만 로그인하는 사용자가 올바른 비밀번호를 입력했는지 확인하는 방법은 무엇일까요? 바로 이 부분에서 해시 함수가 중요한 역할을 합니다. 해시 함수는 예측 가능하지만 되돌릴 수 없는 방식으로 모든 데이터를 고정 길이의 비트 문자열로 스크램블링하는 특수 암호화 알고리즘입니다.


여기서 예측 가능하다는 것은 동일한 데이터가 항상 동일한 해시로 변환된다는 것을 의미합니다. 그리고 비가역적이라는 것은 해시에서 해시된 데이터를 복구하는 것이 완전히 불가능하다는 것을 의미합니다. 사용자 데이터를 조금이라도 소중히 여기고 평판을 중요하게 생각하는 온라인 서비스라면 누구나 그렇게 해야 합니다.


사용자가 등록할 때 비밀번호를 생성하면 비밀번호 자체가 아니라 그 해시가 사용자 이름과 함께 데이터베이스에 저장됩니다. 그런 다음 로그인 과정에서 이 해시를 사용자가 입력한 비밀번호의 해시와 비교합니다. 두 해시가 일치하면 비밀번호가 동일하다는 뜻입니다.


데이터베이스가 유출되는 경우 공격자가 손에 넣는 것은 비밀번호가 아니라 해시로, 원본 데이터는 복구할 수 없습니다(되돌릴 수 없음을 기억하시죠?). 물론 이것은 보안 측면에서 큰 개선이지만, 사이버 범죄자가 해시를 손에 넣으면 무차별 암호 대입 공격을 시도할 수 있으므로 아직 기뻐하기에는 이르다.



더 나은 방법: 솔티드 해시


해커는 데이터베이스를 확보한 후 무차별 암호 대입을 통해 비밀번호를 추출하려고 시도할 수 있습니다. 즉, 문자의 조합을 가져와 해시를 계산하고 데이터베이스의 모든 항목에서 일치하는 항목을 찾습니다. 일치하는 문자가 발견되지 않으면 다른 조합을 시도하는 등의 과정을 거치게 됩니다. 일치하는 항목이 있으면 데이터베이스에서 해시를 계산하는 데 사용된 비밀번호를 알 수 있습니다.


더 심각한 문제는 해시된 비밀번호를 해독하는 프로세스가 레인보우 테이블을 통해 상당히 빨라질 수 있다는 점입니다. 레인보우 테이블은 가장 자주 사용되는 비밀번호에 대해 미리 계산된 해시 함수가 포함된 거대한 데이터 배열입니다. 따라서 도난당한 데이터베이스에서 일치하는 비밀번호를 쉽게 검색할 수 있습니다. 물론 이 모든 과정이 자동으로 이루어지므로 비밀번호를 해독하는 과정이 너무 빨라 안심할 수 없습니다.


하지만 한 가지 좋은 소식이 있습니다. 가능한 모든 문자 조합의 해시를 미리 계산하는 것은 불가능합니다. 모든 해싱 알고리즘을 위한 완전한 레인보우 테이블은 지구상의 디스크 공간보다 더 많은 공간을 차지할 것입니다. 신뢰도가 높지 않은 MD5 알고리즘의 경우에도 이러한 가상의 테이블에는 340 282 366 920 920 938 463 463 374 607 431 768 211 456개의 레코드가 포함됩니다(심호흡). 그렇기 때문에 가장 일반적인 조합만 레인보우 테이블에 포함됩니다.


레인보우 테이블의 사용을 막기 위해 암호학자들은 해시 함수의 또 다른 중요한 특성인 소스 텍스트의 아주 작은 변화만으로도 해싱 결과가 전혀 인식할 수 없을 정도로 변경된다는 점을 활용하는 솔루션을 고안해 냈습니다.


비밀번호 해시가 계산되어 데이터베이스에 기록되기 전에 임의의 문자 집합(솔트라고 함)이 추가됩니다. 이렇게 하면 "12345678" 및 "password"와 같이 가장 기본적이고 명백하며 자주 사용되는 비밀번호조차도 레인보우 테이블로 무차별 대입할 수 없을 정도로 데이터베이스 해시가 수정됩니다.


가장 간단한 변형은 모든 비밀번호에 동일한 솔트를 사용합니다. 그러나 가장 해킹에 강한 방식은 각 개별 레코드에 대해 별도의 솔트를 생성합니다. 이 접근 방식의 장점은 추가적인 위험 없이 동일한 데이터베이스에 솔트를 저장할 수 있다는 것입니다. 즉, 솔트를 안다고 해서 공격자의 작업이 훨씬 쉬워지지는 않습니다. 해시를 해독하려면 여전히 모든 조합을 살펴보는 순수한 무차별 암호 대입을 적용해야 합니다.


비밀번호 비저장 방식을 채택하는 온라인 서비스가 많아질수록 사용자 인증정보의 대량 도난(및 계정 해킹과 관련된 후속 문제)이 발생할 가능성이 줄어듭니다.

반응형