요약

사용자 인증은 “당신이 정말 그 사람인가”를 확인하는 일이고, 대부분의 접근 제어와 책임 추적의 바탕이다. 확인하는 근거는 아는 것(비밀번호), 가진 것(카드), 몸 자체(지문)다. 운영체제는 비밀번호를 그대로 저장하지 않고 소금(솔트)을 친 해시로 저장해서, 파일을 도둑맞아도 비밀번호가 바로 드러나지 않게 한다. 하지만 사람이 고른 비밀번호는 짐작하기 쉽고, 카드는 잃어버리고, 생체 인증은 비싸고 오차가 있다.

예시로 보기

UNIX 로그인에서 비밀번호를 확인하는 과정이다.

  1. 사용자가 ID와 비밀번호를 입력한다.
  2. 운영체제가 ID로 비밀번호 파일에서 그 사용자의 줄을 찾아, 평문 솔트와 저장된 해시 값을 꺼낸다.
  3. 꺼낸 솔트와 입력한 비밀번호를 느린 해시 함수에 넣는다.
  4. 결과가 저장된 해시 값과 같으면 비밀번호를 받아들인다.
비밀번호 파일:   hong | 솔트 7f3a… | 해시 c91e…
입력 "hunter2" → 해시(7f3a… + "hunter2") → c91e…?  같으면 통과

같은 비밀번호 “hunter2”라도 사용자마다 솔트가 다르므로 저장되는 해시 값이 다르다.

검증: 솔트가 다르면 같은 비밀번호의 저장값이 다르고, 맞는 비밀번호만 통과함(PBKDF2 사용). 사전 공격 표 크기 계산 — 65_password-salt_verify.py

정확히 말하면

인증은 대부분의 보안 상황에서 기본 구성 요소이자 첫 방어선이다. 두 단계다.

단계 내용
식별 보안 시스템에 식별자(사용자 ID)를 내놓는다
확인 식별자와 실체를 묶어 주는 인증 정보(비밀번호 등)를 내놓거나 만들어 낸다

인증 요소. 전통적으로 세 가지다.

요소 예
아는 것 비밀번호, PIN
가진 것 카드, RFID 배지
그 사람 자체 생체 정보

생체 정보는 다시 둘로 나뉜다. 정적 생체(그 사람의 몸: 지문, 얼굴)와 동적 생체(그 사람의 행동: 필체, 목소리, 타자 리듬)다. (Nick Mathewson은 이 셋을 “가졌던 것, 잊어버린 것, 예전의 자신”으로 비꼬았다.)

비밀번호

비밀번호로 사용자가 시스템에 접근할 수 있는지와 어떤 권한을 갖는지를 정한다. 임의적 접근 제어를 적용할 수 있다.

해시된 비밀번호. 비밀번호를 저장하는 널리 쓰이는 방법이며 여러 암호 해독 공격에 안전하다. 새 비밀번호를 정할 때 솔트를 고르고, 솔트와 비밀번호를 느린 해시 함수에 넣어 나온 값과 솔트를 함께 저장한다1.

솔트가 하는 일

  • 같은 비밀번호가 비밀번호 파일에서 같은 값으로 보이지 않게 한다.
  • 오프라인 사전 공격을 크게 어렵게 한다. 솔트가 \(b\)비트면, 공격자는 단어마다 해시 값을 \(2^b\)개씩 미리 계산해야 한다. 단어 100만 개, 솔트 12비트면 약 41억 개다1.
  • 한 사람이 여러 시스템에 같은 비밀번호를 썼는지 알아내기 거의 불가능하게 한다.

토큰

사용자 인증을 위해 사용자가 가진 물건을 토큰이라고 한다. 토큰은 메모리 카드와 스마트 카드로 나뉜다.

토큰 내용 단점
메모리 카드 데이터를 저장만 하고 처리는 못 한다. 흔히 비밀번호·PIN과 함께 쓴다 전용 판독기가 필요하다. 잃어버릴 수 있다. 사용자가 불편해한다
스마트 카드 마이크로프로세서, 메모리, 입출력 포트를 가진다. 물리적 특성, 인터페이스, 인증 프로토콜(정적, 동적 비밀번호 생성, 도전-응답)로 종류가 나뉜다  

생체 인증

얼굴, 지문, 손 모양, 망막 무늬 같은 고유한 신체 특징으로 사람을 인증한다. 패턴 인식에 바탕을 두며, 비밀번호나 토큰보다 기술적으로 복잡하고 비싸다. 홍채, 서명, 목소리, 타자 리듬은 패턴이 바뀔 수 있다. 생체 인증 방식마다 비용과 정확도가 다르다2.

활용

  • 현대 리눅스는 비밀번호 해시를 아무나 읽을 수 없는 /etc/shadow에 따로 두고, 느린 해시(sha512crypt, yescrypt 등)를 쓴다1.
  • 여러 요소를 함께 쓰는 다중 요소 인증(비밀번호 + 휴대폰 인증 앱)은 한 요소가 털려도 막아 준다1.
  • 인증한 뒤에 무엇을 할 수 있는지는 접근 제어가 정한다.

연결

확인 문제

C1 솔트 없이 비밀번호를 해시만 해서 저장하면 어떤 문제가 생기는가? 두 가지를 쓰라.

답: ① 같은 비밀번호를 쓴 사용자들의 해시 값이 같아, 파일을 보면 누가 같은 비밀번호를 쓰는지 드러난다. ② 공격자가 흔한 단어의 해시 값을 한 번만 미리 계산해 두면 모든 사용자, 모든 시스템에 그대로 쓸 수 있다(사전 공격이 쉬움).

C2 UNIX 로그인에서 사용자가 ID와 비밀번호를 입력한 뒤 운영체제가 하는 일을 순서대로 쓰라.

답: ① ID로 비밀번호 파일에서 줄을 찾음 ② 저장된 솔트와 해시 값을 꺼냄 ③ 솔트 + 입력 비밀번호를 해시 ④ 저장된 해시 값과 비교해 같으면 통과.

C3 다음은 아는 것, 가진 것, 그 사람 자체(정적·동적) 중 무엇인가? ① 은행 OTP 기기 ② 서명할 때의 필압과 속도 ③ 휴대폰 잠금 PIN ④ 얼굴 인식

답: ① 가진 것 ② 그 사람 자체, 동적 생체 ③ 아는 것 ④ 그 사람 자체, 정적 생체.

  1. 비밀번호를 정할 때의 저장 절차, 사전 공격 표 크기 계산, /etc/shadow와 다중 요소 인증, 확인 문제는 Stallings 6판 15.1절과 리눅스 문서를 바탕으로 보탰다. ↩ ↩2 ↩3 ↩4

  2. Stallings, Operating Systems: Internals and Design Principles 6판, 그림 15.2(생체 인증 방식별 비용과 정확도). ↩