Computer Science/Network Security

[CS][알기 쉬운 정보보호개론 3판] Chapter12. Key

y-seo 2023. 12. 6. 11:31

 

 
 

Key의 안정성

  • 암호(Cryptography) 기술을 사용하려면 대부분 키(key) 가 사용된다.
    • 가역적으로 만들기 위해서
    • 평문 ↔ 암호문
  • 키 값의 크기보다 키 공간(key space)의 크기가 더 보안성과 밀접한 관련이 있다.
    • 키는 길이가 아니라 “가능한 키들의 집합”이 더 중요한 요소
  • 키 공간의 크기를 키우기 위해서는 키의 bit 수를 키우는 것이 중요하다.
    • AES, DES 등의 대칭키 암호화 알고리즘 : 키의 자리수가 곧 키 공간의 크기와 연결된다. 예를 들어 AES-256은 키의 길이가 256비트이므로 키 공간의 크기가 2^(256), trivial한 것 빼고는 다 가능하다.
    • RSA나 Diffie-gellman과 같은 공개키 암호화 알고리즘 : 소수의 크기와 수학적 특징이 키 공간의 크기와 연결된다. 흔히 쓰는 RSA의 경우, 키의 길이가 1024비트이거나 2048비트이지만, 키 공간의 크기는 2^(1024), 2^(2048) 보다는 각각 훨씬 작다.
    • = RSA가 키의 길이가 더 길다.
  • 키가 노출되면, 그 즉시 평문 또한 노출되기 때문에 키와 평문은 동일한 혹은 그 이상의 가치를 지닌다고 볼 수 있다.
  • 키가 노출되지 않기 위해서는 검증된 암호 알고리즘을 사용하고 키를 잘 보관해야 한다.

 

 
 

키의 종류

  • 공개키/대칭키 알고리즘에 따른 키의 종류
    • 대칭키
      • 통신을 하는 쌍방이 공유하는 키
      • 대칭키 암호화 뿐 아니라 Message Authentication Code에도 사용된다.
    • 공개키/비밀키
      • 공개키 암호 기술에 사용되는 키 쌍으로, 비밀키만 주인이 갖고, 공개키는 문자 그대로 공개한다.
      • RSA 등과 같은 공개키 암호화 뿐 아니라 디지털 서명에도 사용된다.
  • 사용 목적에 따른 분류
    • 기밀성 유지 목적으로 사용되는 키
    • 인증 목적으로 사용되는 키
  • 키 사용 횟수에 따른 분류
    • 마스터키 (Master Key)
      • 세션키를 생성하기 위해 사용된다.
      • 고정된 키로, 주로 관리자만이 갖고 있는 키이다.
      • 노출되거나 유효기간이 지나지 않는 이상 계속 사용된다.
    • 세션키 (Session Key)
      • 세션 : 1번의 연결
      • 임시로 쓰는 키
      • 대칭키라고도 부른다.
      • 통신에서 한 세션에서 이동하는 모든 데이터를 암호화할 때 쓰는 키
      • 그 세션에서만 사용되고 세션이 끝나면 폐기된다.
      • 주로, 마스터 키로부터 만들어진다.
  • 암호화 대상에 따른 분류 (무엇을 암호화 하느냐)
    • CEK (Contents Encryption Key) 또는 TEK (Traffic Encryption Key) : 데이터를 암호화할 때 사용되는 키
      • Traffic : 전송되는 데이터
    • KEK (Key Encryption Key) : Enigma에서 나왔던 것(오늘의 키를 암호화할 때 사용), 키를 암호화할 때 사용되는 키, 대칭키인지 공개키인지 따지지 않음

 

 
 

CEK, KEK 사용의 예시

  • KEK는 사전에 공유 중이다.
  • If, CEK가 업데이트 되어야 하면

알기 쉬운 정보보호개론 3판

 

 
 

키 관리 기법 - 키 생성

  • 난수로부터 만드는 방법
    • 사람의 Action이 없는 경우 (Https에서의 홈페이지 접속)
    • 난수 : 무작위성, 예측불가능성
    • 난수로 만드는 것이 좋은 이유 : 키 성질 중 “다른 사람이 추측하기 어려워야 한다.” 는 것이 있는데, 난수가 바로 그런 추측하기 어렵다는 성질이 있기 때문이다.
    • 난수를 생성하기 위해서는 하드웨어를 이용하는 것이 가장 좋다. 대부분 그것이 힘들기 때문에 소프트웨어로 구현된 의사난수를 사용한다.
      • 하드웨어는 로직이 들키면 안되어 거의 사용되지는 않지만, 군통신에서는 사용한다. 난수 발생 원리를 회로를 봐야 알 수 있기 때문에 알기 어려워서 좋다.
      • 소프트웨어는 로직이 들켜도 로직 변경만 하면 된다. 디컴파일하여 소스코드를 볼 수 있기 때문에 안좋다.
  • 비밀번호로부터 만드는 방법
    • 사람의 Action이 있는 경우 (집 PW 같은)
    • 비밀번호를 그대로 키로 쓰기 보다는, 비밀번호를 해시 함수에 넣은 값을 키로 사용한다. (비밀번호 그 자체는 추측하기가 상대적으로 쉽기 때문이다.)
    • 보안성을 강화하기 위해 비밀번호만 해시 함수에 넣는 것이 아니라 (H(pw)만 계산하는 것이 아니라) 추가적인 작은 값을 같이 해시함수에 넣어서(H(pw,s)와 같이 계산) 키를 만들어낼 수 있는데, 여기서 이 추가적인 작은 값 s를 솔트(salt)라고 한다.
    • 솔트의 역할은 사전 공격 (Dictionary Attack)을 방지하는 것이다.
      • 이것저것 될만한 것 다 넣어보기
      • 한 번 더 거쳐서 안전하다.
      • 길이가 제각각이기 때문에 고정 길이로 만들기 위해 해시 함수를 사용한다.
      • 공격자가 PW를 알아내는 방법 : 사용자와 연관된 PW일테니까 (30% 성공률) → 이를 방지하기 위해 salt를 첨가한다.
  • 위 두가지 방법 중 상황에 맞게 쓰면 된다.

 

 
 

키 갱신과 배송

  • 키 업데이트를 해야 하는 시점
    • 유효기간이 끝났을 때 : 어느 정도 시간이 지나면 키는 노출이 되었다고 본다
    • 키가 노출되었을 때 : 유효기간이 안 끝났을지언정
    • 일정 횟수 이상 키가 사용되었을 때
  • 갱신(update된 키는 안전하게 보관해야 한다.
    • = Forward Secrecy
    • 그렇지 않으면 앞으로 전달될 메세지들이 노출될 수 있기 때문이다
    • 키가 노출되었는데도 원래 키로 계속 보내게 되면 보내는 내용들이 모두 노출된다.
    • 정해진 사람들에게만 보내야 한다.
  • 키 배송을 위해서는 사전에 공유된 KEK로 암호화하거나 공개키 암호화 방식을 이용하여 키를 암호화 하여 전송한다.
    • 새로운 키를 KEK로 암호화 하여 보낼 수 있다.

 

 
 

키의 폐기

  • 키를 더이상 사용하지 않을 때 폐기를 한다.
    • 메모리에서 삭제하는 행위
  • 키가 갱신되었을 때 갱신 전 키는 안전하게 폐기해야 한다.
    • = Backward Secrecy
    • 그렇지 않으면 오래전부터 암호화된 메세지를 수집하고 있다가 폐기된 키를 이용하여 복호화 할 수 있기 때문이다.
  • 따라서 보안 SW를 개발할 때, 키 생성/암복호화 뿐만 아니라 키 폐기 과정도 안전하게 수행될 수 있도록 설계해야 한다
  • 키를 잃어버렸을 때
    • 대칭키를 잃어버리면 복호화를 못한다
    • MAC용 키를 잃어버리면 무결성 검증을 못한다
    • 공개키 암호화에 사용되는 비밀키를 잃어버리면 복호화 or 서명을 못한다.

 

 
 

PBE (Password-based Encryption)

  • 비밀번호를 이용하여 만든 키로 데이터를 암호화 하는 기법
  • 과정
    1. 비밀번호로 KEK 생성
    2. 세션 키 생성 이후 KEK로 암호화
    3. 메세지를 세션키로 암호화하여 통신
  • 세션키는 랜덤함수로 만든 CEK 또는 TEK이다.
  • 기본적으로 서버에 로그인할 때 ID/PW가 사용되기 때문에 PBE가 많이 사용된다.
    • Email로 ID를 대신하여 쓰기도 한다. → 덜 기억해도 돼서 좋다. & ID 중복이 안 일어나서 좋다.
  • IBE : Email & PW 로 키를 만드는 방법

 

 
 

Unix에서의 비밀번호 보안

  • Salt의 세가지 기능
    1. 비밀번호가 비밀번호 파일에서 보여지는 것을 방지 한다
      1. 두 사용자가 같은 비밀번호를 가지더라도 salt가 다르기 때문에 비밀번호 파일에 저장된 두 사용자의 값은 서로 다르다
    2. Offline dictionary attack을 어렵게 만든다
    3. 서로 다른 시스템에 가입된 사용자가 같은 비밀번호를 사용했는지 알기 어렵게 만든다
      1. salt가 달라지면 hash값도 달라지기 때문에 알기 어렵다.
  • 기존 Unix에서의 비밀번호 관리 방법
    • 비밀번호는 8자리 ASCII 값, 12비트의 salt를 이용
    • DES 를 25번 반복 사용하여 비밀번호를 암호화
    • 하지만, 근본적으로 비밀번호가 짧기 때문에 현재 컴퓨터 환경에는 맞지 않음
  • 현재 Unix에서의 비밀번호 관리 방법
    • 임의 길이의 비밀번호, 48비트의 salt를 사용한다.
    • MD5 해시 함수를 사용하며, 이 해시 함수 내부에는 1000회 반복하는 반복문이 포함 되어 있다. → 1000번 돌리면 저속이 된다.

 

 
 

PEB 암호화

알기 쉬운 정보보호개론 3판

 

 
 

PEB 복호화

알기 쉬운 정보보호개론 3판

 

 
 

salt의 역할

  • Dictionary attack을 방지하기 위해서이다.

알기 쉬운 정보보호개론 3판

 

 
 

salt로 비밀번호를 관리할 때 공격 방법

  1. 공격자가 비밀번호 파일을 얻었다고 가정한다.
  2. 공격자가 가능한 모든 비밀번호와 모든 salt들을 이용하여 대규모의 사전을 만든다.
    • 크게 어려운 일 …
  3. 사전 안의 해시값과 비밀번호 파일의 해시값을 비교하여 비밀번호를 알아낸다.
    • 거꾸로 추측하는 일
  4. 만일 해시값이 같은 경우가 없으면 크래킹 프로그램은 가능한 패스워드로 구성된 사전 안의 모든 단어를 변형하여 다시 시도
    • 변형 방법: 단어를 거꾸로 해서 적용, 추가 숫자나 특수문자 적용
  • Rainbow Table
    • 문자열과 해당 문자열의 해시값의 쌍을 저장해놓은 표
    • 영문자만 가능하고 특수문자가 섞이면 만들기 어렵다 → 경우의 수가 너무 많아져서
    • 공격자에게 Rainbow Table이 있다면, 해시 함수를 계산할 필요가 없으므로 비밀번호를 좀더 빠르게 알아낼 수 있다. • Rainbow Table을 이용한 공격에 대처하기 위해서는 비밀번호를 충분히 길게, 숫자, 특수 문자를 섞어서 정하도록 해야 한다.
  • stretchig
    • 저속 함수를 만들기 위해서이다
    • PW + salt 에 해시함수를 여러 번 적용시키는 방법

 

 
 

비밀번호 결정 방법

  • 가장 좋은 비밀번호 : 사용자는 외우기 좋지만, 공격자는 추측하기 힘든 비밀번호
  • 비밀번호 추측 기술이 발달되어서.. 사용자에게 어려운 비번 만들라고 요구 중
  • 알려진 비밀번호 추측 방법
    1. 사용자의 이름, 머리글자, 계좌명, 그 밖의 신상정보 시도
    2. 여러 사전에 나오는 단어를 시도
    3. 1/2단계에 나온 단어를 다양하게 조합
      • 이 절차에는 첫 문자를 대문자나 제어문자로 만들기
      • 단어 전체를 대문자로 만들기
      • 단어 순서를 거꾸로 하기
      • 문자 “o”를 숫자 “0”으로 바꾸기 등
    • 위의 방법대로 하면 25% 성공률로 비밀번호를 알아낼 수 있었다.
    • 따라서 PW 생성/관리 Tool을 이용하는 것이 바람직하다.
    • 잊어버리지 않게 하기 위해 적절한 곳에 메모하고 메모도 철저하게 관리해야 한다.
  • 만드는 방법 (4가지)
  1. User education
    1. 단순히 사용자에게 비밀번호 만드는 방법을 알려주는 것
    2. 뭐뭐 넣으세요~
  2. Computer-generated passwords
    1. 컴퓨터가 생성해서 전달해주는 방법
    2. 이거 쓸래?
  3. Reactive password checking
    1. 시스템이 비밀번호 크래킹 프로그램을 구동하여 비밀번호를 알아내도록 시도한다. → 시스템이 크래킹을 성공하면, 사용자에게 알려주고 비밀번호를 바꾸도록 강제한다
    2. 크래킹 프로그램 : 내가 정한 PW를 컴퓨터가 자체적으로 추측해보는 프로그램
    3. user education의 연장
  4. Proactive password checking
    1. 사용자에게 비밀번호를 선택하게 하고, 시스템이 비밀번호의 안전성을 검사한다.
    2. 현재 널리 사용되는 방법
    3. user education의 연장
  • 크래킹 ↔ 해킹 : 해킹은 금지된 행위를 깨서 할 수 있게 만드는 것, 해킹에 범죄 행위가 추가되면 크래킹이 된다. 해킹은 범죄/비범죄 행위가 있지만 크래킹은 그냥 다 범죄 행위이다.

Bloom filter

  • 원소가 집합에 속하는지 여부를 검사하는데 사용되는 확률적 자료 구조
    • 어떤 데이터가 그 집합의 원소인지 판별 → 시간이 더 오래걸려서 overhead도 생긴다.
  • 사용자가 금지된 비밀번호를 사용하지 못하게 하는데 효율적이다. (비밀번호의 사용 가능 여부 확인) → 위의 문제를 해결하기 위해 bloomfilter을 사용한다.
  • 현재 Linux에서도 사용되고 있다.
  • Bloom Filter에 원소 추가 과정 : Bloom filter을 쓰려면 먼저 만들어야 한다.