해싱 vs. 암호화: 서버에 비밀번호가 저장되는 방식

예를 들어, VerySecureWebsite.com에 계정을 설정한다고 가정해 봅시다. 이메일 주소와 비밀번호를 입력하고 계정을 설정합니다. 잠시 후, 아이러니컬하게도 그 웹사이트가 해킹당했다는 이메일을 받게 되며, 평문으로 저장된 모든 사용자 이름과 비밀번호가 다크 웹에서 팔리고 있다고 알립니다. 모든 계정의 비밀번호를 변경하기 시작할 때 (당신은 단 하나를만 사용합니다, 당신의 괴물), “ 그건 나쁜 생각이 아닌가? 해커들이 그냥 읽지 못하도록 내 비밀번호는 어떤 비밀 코드로 저장되어야 하지 않나? ”라고 의문을 품게 됩니다.

당신의 말이 맞습니다. 사용자 이름/비밀번호 로그인 시스템을 사용하는 웹 앱이나 서비스는 반드시 사용자의 비밀번호를 솔트가 있는 해시, 아마도 솔트가 있는 느린 해시, 아마도 페퍼와 함께 저장해야 합니다. 이러한 내용이 암호학보다는 아침 식사처럼 들리기 시작했다면 걱정하지 마세요: 당신의 비밀번호(바라건대)와 달리, 안전한 비밀번호 저장은 그렇게 어려운 주제가 아닙니다.

또한 읽기: 웹사이트 비밀번호 제한이 당신을 안전하게 지키지 않는 이유

평문과 기본 암호화

password-storage-plaintext

사용자 이름입력한 비밀번호저장 형태
UnwittingUserWeakPasswordWeakPassword

인터넷에 연결된 데이터베이스에 평문 비밀번호를 저장하는 것은 꽤 나쁜 생각입니다: 데이터베이스가 해킹당하면, 그 비밀번호를 재사용한 사람들은 위험에 처하게 됩니다. 그럼에도 불구하고 불안한 수의 웹사이트들이 여전히 그렇게 하고 있으며, 아마도 보안 업그레이드가 기업보다 고객을 위해 더 많이 이루어지기 때문일 것입니다. 사이트가 이렇게 하고 있는지 테스트하고 싶다면, “비밀번호를 잊어버림” 옵션을 선택해 보세요. 비밀번호 재설정 링크 대신 그냥 비밀번호를 보내준다면, 그 비밀번호는 평문으로 저장되고 있습니다.

사용자 이름입력한 비밀번호AES-128 키로 암호화됨: WeakKey
UnwittingUserWeakPassword38MkoXVXoKe01uAOROBLpQ==

암호화는 비밀번호를 저장하는 강력한 방법처럼 들리지만, 실제로는 평문보다 한 단계 위일 뿐입니다. 암호화된 비밀번호는 일반적으로 키로 해독될 수 있으며, 해커가 이를 찾거나 추측할 수 있다면 암호화는 무의미해집니다.

해싱 > 암호화

password-storage-hashing

사용자 이름입력한 비밀번호해시를 위한 문자열SHA-256으로 해시됨

| UnwittingUser | WeakPassword | WeakPassword | 252E2406732308F9A7
B378ED94E78467D14
077D19C8282443FCD
3D6190FCABFA |

해시 함수는 기본적으로 일방향 암호화입니다: 당신은 평문 비밀번호를 비밀 코드로 변환하지만, 다시 변환할 수 있는 키가 없으므로 해시된 버전에서 실제 비밀번호를 유추할 수 없습니다.

대부분의 안전한 웹사이트는 비밀번호를 이렇게 관리합니다:

  1. 사용자가 계정을 생성합니다.
  2. 사용자의 비밀번호가 해시 함수로 실행되고 데이터베이스에 저장됩니다.
  3. 사용자가 로그인할 때마다 데이터베이스는 그들이 입력한 비밀번호를 해시로 변환하여 기존의 해시와 일치하는지 확인합니다.
  4. 맞다면, 사용자는 로그인할 수 있습니다.

해시를 사용하면, 앱/사이트는 실제 비밀번호를 어느 곳에도 저장하지 않으며, 해킹당한 사람은 해독할 수 없는 문자와 숫자의 목록만 얻을 수 있습니다. 알고리즘이 얼마나 강력한지에 따라, 이러한 해시는 해제하기 꽤 어렵습니다.

하지만 해시는 해킹 방지 수단이 아닙니다. 공격자는 단지 가능성 있는 비밀번호의 사전을 해시 함수에 입력하고, 그런 다음 그 해시를 데이터베이스의 해시와 비교하는 것으로 끝납니다. 두 해시가 일치하면, 해커는 어떤 비밀번호가 그 해시를 생성했는지를 확인할 수 있습니다.

시간과 계산 능력을 절약하기 위해 많은 공격자들은 미리 생성된 잠재적 비밀번호와 그 해시로 가득한 조회 테이블(혹은 “레인보우 테이블“)을 사용합니다. 사실, 평문 단어를 해시한 다음 그 해시에 대해 조회 테이블을 사용하는 것을 직접 시도할 수 있습니다; 그렇게 어렵지 않습니다. 본질적으로, 당신의 비밀번호가 어느 정도 일반적이라면, 그 비밀번호의 해시는 아마 이미 조회 테이블에 있을 것입니다. 이는 일반 비밀번호를 사용하지 말아야 할 좋은 이유입니다.

또한 읽기: 이 팁과 도구를 사용하여 강력한 비밀번호 만들기

솔트가 있는 해시 > 해시

password-storage-salt

| 사용자 이름 | 입력한 비밀번호 | 해시를 위한 문자열 | SHA-256으로 해시됨,
솔트 = XcyKn42, 앞에 추가됨 | | — | — | — | — | | UnwittingUser | WeakPassword | XcyKn42WeakPassword | 13EB660FF7FBD29A728FC5
92297D78DF19AFF8797363
15FBF1F1C4B7123BD10C |

달팽이와는 달리, 솔트는 해시를 더 강하게 만듭니다. 평문 단어의 한 글자라도 변경되면 전체 해시가 바뀌기 때문에, 사이트가 조회 테이블을 방해하기 위해 할 일은 해시하기 전에 비밀번호에 추가 평문을 추가하는 것입니다. 공격자는 데이터베이스에 저장된 솔트를 읽을 수 있지만, 이것은 모든 가능한 비밀번호와 솔트 조합을 다시 계산하게 만듭니다.

물론, 솔트가 있는 해시도 여전히 깨질 수 있습니다. 해커는 자신이 추측하고 있는 비밀번호에 솔트를 추가하고, 조합을 해시한 다음 일치하는 것이 나타날 때까지 기다리면 됩니다 - 이것이 표준 사전 공격입니다. 현대 GPU는 초당 수십억 개의 추측을 수행할 수 있으므로 이것은 전혀 불가능하지 않지만, 이 과정은 훨씬 더 성가시게 만듭니다. 그렇지 않으면, 무차별 대입 공격은 느리지만 매우 효과적입니다.

해시를 더욱 강하게 만드는 방법: 다른 전술

password-storage-pepper

| 사용자 이름 | 입력한 비밀번호 | 해시를 위한 문자열 | Bcrypt로 해시됨,
솔트 = XcyKn42, 앞에 추가됨,
12 회전 | | — | — | — | — | | UnwittingUser | WeakPassword | XcyKn42WeakPassword | $2y$12$6OleutQBO2iPoNvg
pyDndOU26Lqt9Y34f6PLEOx
mCELP5GoswrJT. |

느린 해싱 알고리즘, 예를 들어 PBKDF2나 bcrypt는 “키 스트레칭”이라고 불리는 기법을 사용하여 사전 공격 및 무차별 대입 공격 속도를 늦춥니다. 이것은 해시 함수를 특정 횟수만큼 반복적으로 설정하는 것이 포함되며 (하지만 이는 단순히 같은 작업을 반복하는 것보다 더 복잡합니다), 올바른 해시에 도달하기 위해 많은 계산 능력이 필요합니다. 사이트가 이것을 모두 실행하고 있다면, 그들의 보안은 꽤 좋습니다.

| 사용자 이름 | 입력한 비밀번호 | 해시를 위한 문자열 | Bcrypt로 해시됨,
솔트 = XcyKn42, 앞에 추가됨,
12 회전,
페퍼 = |4|\/|@p3pp3r, 뒤에 추가됨 | | — | — | — | — | | UnwittingUser | WeakPassword | XcyKn42WeakPassword|4|\/|@p3pp3r | $2y$12$njmWr5UMydCzdCE44ElW/
OIfYp2PH9sgonCATyVY.OVKSpmoSaZlu |

추가 안전성을 위해, 해시가 이미 솔트가 있는 경우에도 “페퍼”를 추가할 수 있습니다. 페퍼는 해시되기 전에 비밀번호에 부착된 값의 집합입니다. 그러나 솔트와는 달리, 페퍼 값은 하나만 존재하고 비밀로 유지되며, 솔트 및 해시와는 별도로 존재합니다. 이는 솔트 해시에 또 다른 보안 계층을 추가하지만, 만약 공격자가 이를 찾아낸다면, 새로운 조회 테이블을 계산하는 데 그냥 사용할 수 있기 때문에 더 이상 유용하지 않습니다.

해시에 대해 해시를 만들지 마세요

비밀번호 보안은 큰 진전을 이루었으며 – 그 보안을 해제하는 기술도 마찬가지입니다. 불행히도, 인간은 여전히 비밀번호 관리에 서툴고, 데이터베이스는 보안을 자주 업그레이드하지 않습니다. 일반적으로, 계정을 생성할 때마다 비밀번호가 상대적으로 약한 보안으로 저장된다고 가정하세요. 만약 당신의 비밀번호가 일반적이거나 사전 단어라면, 이는 해제될 가능성이 높습니다. 당신의 비밀번호를 길게 만들고, 문자, 숫자 및 기호를 혼합하면 해시 함수가 최선을 다할 수 있도록 도와줄 수 있습니다.