[DB] 비밀번호를 암호화하여 안전하게 저장하기

smlee·2022년 6월 24일
3

DB

목록 보기
1/1

우리가 비밀번호를 잊어버렸을 때 크게 2가지 방법으로 계정에 재접근 가능하도록 한다.

  1. 비밀번호 재발급
  2. 비밀번호 찾기(까먹은 비밀번호 자체를 찾음)

현재 대부분의 사이트에서는 1번 방법인 비밀번호 재발급을 하여 비밀번호를 재설정 후 계정에 재접근할 수 있도록 한다.

비밀번호를 알려주면 편할텐데 왜 굳이 재발급을 받도록하는 것일까?

비밀번호 저장 방법이 다르므로 계정에 재접근하는 방식이 다르다.

  1. 비밀번호 재발급 → 단방향 해시함수(one-way hash function)다이제스트(digest)된 방식으로 암호 저장
  2. 비밀번호 찾기 → 단순 텍스트(Plain Text)로 암호 저장

이러한 암호 저장 방식의 차이가 계정 재접근 방법의 차이를 부른다.

📜 단순 텍스트(Plain Text)

만약에 daisy@naver.com이라는 이메일을 가진 유저가 회원가입을 할 때
비밀번호를 asdf라고 설정했다고 가정해보자.

이럴 경우, DB에서는 다음과 같이 저장된다.

별다른 조치가 취해지지 않고 사용자가 가입할 때 사용했던 데이터들이 온전히 저장되어 있다.

심지어, 비밀번호까지도 그대로 저장되어있다. 이처럼 정보를 있는 그대로 저장하는 방법인 단순 텍스트 방법을 사용한 DB에서는 사용자의 비밀번호를 그대로 알려줄 수 있다.

하지만, 이 방법에는 문제점이 있다. DB가 해킹 당하는 순간, 비밀번호들과 민감한 정보들이 그대로 유출된다. 따라서 보안에 취약하다. 이러한 문제점 때문에 대부분의 서비스들은 단순 텍스트 방식을 사용하지 않는다.

그렇다면 이러한 단순 텍스트의 문제점인 보안 취약성을 보완하는 방법에는 무엇이 있을까?

🔐단방향 해시함수(One-way Hash Function)

위에서 보았던 단순 텍스트의 보안적 취약성의 대안으로 단방향 해시함수가 있다.

단방향 해시함수수학적 연산을 통해 원본 메세지를 변환하여 암호화된 메세지인 다이제스트를 생성한다. 이러한 단방향 해시함수는 원본 메세지를 알면 암호화된 메세지를 구하기 쉽지만, 암호화된 메세지를 알아도 원본 메세지를 구할 수 없단방향성을 특징으로 가진다.

이러한 단방향 암호화복호화할 수 없는 암호화 방법이므로 보안적 안정성이 높다.

실제로 이러한 단방향 해시함수를 사용해서 저장하면 어떻게 될까?

이렇게 해시함수를 거친 다이제스트가 DB의 password 컬럼에 저장된다. 이렇게 단방향 해시함수를 사용하면 운영자들도 유저의 비밀번호를 모른다. 게다가, DB가 해킹이 당해도 안전하다. 다만, 계정에 재접근할 시 비밀번호를 재설정해야한다.

그런데 여기서 의문점이 든다. 운영자들도 유저의 비밀번호를 알 수 없는데 어떻게 비밀번호가 옳고 그른지 확인할 수 있을까?

DB에 저장된 Digest와 사용자가 입력한 패스워드를 해시함수로 암호화한 값을 비교하여 DB의 Digest 값과 사용자가 입력한 패스워드의 Digest 값이 같으면 올바르게 비밀번호가 입력되었다고 판단한다. 이러한 단방향 해시함수의 대표적인 예로 SHA-256이 있다.

하지만 이러한 단방향 해시함수 암호화 방법에도 문제가 있다. 다이제스트 목록을 저장한 레인보우 테이블레인보우 공격을 할 경우 보안에 취약하다. 게다가 패스워드가 같으면 다이제스트도 같으므로 정보가 같이 탈취될 수 있다.

🧂단방향 해시 함수 보완

그렇다면 다이제스트 값을 쉽게 알지 못하도록 보완을 해야 안전할 것이다.

그래서 다이제스트를 생성할 때 바이트 단위의 랜덤 문자열을 추가하여 쉽게 다이제스트를 알아내지 못하도록 한다. 이러한 랜덤 문자열솔트(Salt)라고 한다. 그리고 이렇게 솔트를 추가하여 다이제스트를 생성하는 것솔팅(Salting)이라고 한다.

위의 그림이 솔팅을 하는 방식이다. 즉, 랜덤 문자열과 비밀번호를 연결하여 문자열을 생성 후 그 문자열을 해싱하는 것을 솔팅이라고 한다. 따라서 공격자가 비밀번호의 다이제스트를 알아내더라도 솔팅된 다이제스트를 대상으로 패스워드 일치 여부를 확인하기 어렵다.

거기에 생성된 다이제스트를 입력 값으로 하여 또 다른 다이제스트를 생성할 수 있다.

이렇게 N번에 걸쳐서 솔팅을하는 이유는 브루트포스 방법을 방지하기 위함이다. 이렇게 재귀적으로 암호화하는 방식을 키 스트레칭(key stretching)이라고 한다.


💻 Reference

  1. 단방향 해시함수

  2. Security - 안전한 패스워드 저장 방법(단방향 해시함수란?)

  3. 안전한 패스워드 저장

0개의 댓글