정보 일반적으로 비밀번호를 어떻게 저장하고 관리할까
페이지 정보
본문
개발자는 패스워드를 어떻게 관리할까?
보안이라는 건 어렵게 생각하면 끝도 없이 어렵지만, 조금만 쉽게 생각하면 의외로 이해하기 쉽다.
결국 핵심은 이거다. 사용자는 조금 귀찮게, 해커는 아주 많이 귀찮게 만들어서 시도를 포기하게 하거나, 악착같이 뚫으려 해도 중간에 관리자한테 걸리게 만드는 구조로 설계하는 것.
물론, 한 단계 더 깊게 들어가면 아예 시스템의 존재 자체를 숨겨서 '뭔가 있다는 것조차 모르게' 하는 방법도 있는데, 이쪽도 실제로 꽤 많이 쓰인다.
아무튼, 그래서 일반적으로 사용하는 사용자 비밀번호 인증 방식은 어떻게 구현하느냐?
기본적인 비밀번호 관리
사용자가 입력한 비밀번호에 시스템마다 지정한 특정 문자열(보통 SALT라고 부른다. 말 그대로 '소금' 치는 거다)을 덧붙여서 암호화해 저장한다.
이렇게 하면 SALT가 유출되지 않는 한 거의 안전하다.
같은 비밀번호를 입력해도 SALT가 다르면 결과가 달라지기 때문에 단순 무차별 대입 공격(Brute Force)에도 강해진다.
여기서 나는 한 단계 더 꼬아서,
[비밀번호] + [사용자 아이디] + [SALT 키값]
같은 식으로 한 번 더 비틀어 암호화해서 저장하는 걸 선호한다.
설령 암호화된 문자열이 유출되더라도, 내가 정한 변환 규칙이나 키, 사용자 아이디까지 알아야 복호화가 가능하기 때문에 그냥 일반적인 공격으로는 뚫기 어렵다.
근데 참 신기한 게, 세상에는 다양한 개발자와 시스템이 있다.
나는 로그인 실패 시 힌트를 절대 주면 안 된다고 생각하는 쪽인데,
간혹 비밀번호가 어떻게 틀렸는지 구체적으로 알려주는 친절한(?) 시스템도 있더라.
"비밀번호가 틀렸습니다"까진 이해하지만, "대문자가 잘못됐습니다" 같은 건 진짜 에러다. (해커한테 도움 주는 꼴)
또, 암호화된 비밀번호를 DB에 던져서 '있냐 없냐' 체크하면 되는 걸,
굳이 DB에서 사용자 정보를 통째로 끌고 와서 프로그램 서버(WAS)에서 비밀번호 비교를 하는 비효율적인 구조도 본 적 있다.
DB랑 WAS 통신 자체가 오버헤드인데, 쓸데없는 데이터를 끌고 오지 말자고 제발...
심지어 암호화조차 안 하고 비밀번호를 평문으로 저장한 시스템도 본 적 있는데,
이게 보안성 검사를 통과한 사연이 기가 막힌다.
내부망 시스템이라, 사번 찍고 들어가는 물리적 보안이 철저해서 "이 정도는 괜찮다"고 넘어간 케이스.
(물론 개인적으론 절대 용납 못 한다…)
사실 현실적으로는 귀찮아서 잘 안 구현하지만, 예전에 생각해본 보안 아이디어도 있다.
학습 기간을 일주일만 부여하고, 그동안 사용자 패턴을 학습해서 평소 사용하는 시간대에만 접근을 허용하는 방식.
15분마다 무조건 시스템 잠금하고, 재인증을 요구하는 방식.
이런 시스템, 실제로 일부 민감한 보안 영역에서는 쓰긴 하더라.
결국 이 모든 걸 해도 2단계 인증(2FA) 이 생기고, 일회용 비밀번호(OTP) 가 나오고, IP 보안까지 붙여도…
보안은 뚫린다.
왜냐고?
보통 개발자와 사용자 합작으로 뚫리거든. ㅋㅋㅋㅋ
개발자가 귀찮답시고 제대로 구현 안해놓고, 사용자는 사이트마다 같은 비밀번호 돌려쓰고, 주기적으로 바꾸라고 해도 안바꾸잖아
일차 책임은 보안담당자인 관리자한테 있지만 뭐 사용자도 하란대로 안하고서 탓하면 곤란하더라.
댓글목록
리뉴아님의 댓글
리뉴아
작성일
캣타워님의 댓글의 댓글
캣타워
원글
작성일
나가뒈져야함
마이벙커님의 댓글
마이벙커
작성일
여기도 만들긴 해야하는데 귀찮구만..
캣타워님의 댓글의 댓글
캣타워
원글
작성일
리뉴아님의 댓글의 댓글
리뉴아
작성일