posted by JakeYeom 2019. 9. 30. 17:07

단방향 해시 함수

  • 암호화연산을 통해 원본 메시지를 변화시켜 다이제스트(해싱 공식에 생성된 문자열)를 생성
  • 단방향성: 원본메시지를 구하면 암호화된 메시지를 구하기는 쉽다. 그러나 암호화된 메시지로 원본 메시지를 구할수는 없다.

 

단방향 해시함수의 문제점

  1. 인식 가능성: 동일한 메시지가 항상 동일한 다이제스트를 갖는다면 해커가 다이제스트를 많이 확보한뒤 결과를 토대로 원본메시지를 유추해거나 악용할 수 있다. 이와 같은 다이제스트 목록을 레인보우 테이블이라하고 레인보우 공격이라 한다.
  2. 속도: 해시함수의 목적이 짧은시간에 데이터를 검색하기 위해 설계된것이다. 해시함수의 빠른속도를 이용하여 해커가 다이제스트를 원본문자열과 비교해볼 수 있다(데이터가 충분히 길거나 복잡하지 않은 경우 탈취가능).

 단방향 해시함수 보완하기

  • 솔팅(Salting): 솔트(salt)는 단방향 해시 함수에서 다이제스트를 생성할 때 추가되는 바이트 단위의 임의의 문자열이다. 이 원본 메시지에 문자열을 추가하여 다이제스트를 생성하는 것을 솔팅이라한다. 솔트의 길이는 32바이트 이상이어야 솔트와 다이제스트를 추측하기 어렵다.
  • 키 스트레칭(key stretching): 원본메시지를 암호화로 다이제스트를 생성하고, 생성된 다이제스트를 입력 값으로 하여 다이제스트를 생성하고, 이를 반복하는 방법으로 다이제스트를 생성할 수 있다. 이렇게 하면 입력한 패스워드를 동일한 횟수만큼 해시해야 입력한 패스워드 일치 여부를 확인할 수 있다. 이것을 키 스트레칭이라 한다.
  • Adaptive Key Derivation Functions: 다이제스트를 생성할 때 솔팅과 키 스트레칭을 반복하며 솔트와 패스워드 외에도 입력 값을 추가하여 공격자가 쉽게 다이제스트를 유추할 수 없도록 하고 보안의 강도를 선택할 수 있다.
  • adaptive key derivation function중 주요한 key derivation function
    • PBKDF2: 가장 많이 사용된다. 해시 함수의 컨테이너로 솔트를 적용한 후 해시 함수의 반복 횟수를 임의로 선택할 수 있다.
      • DIGEST = PBKDF2(PRF, Password, Salt, c, DLen)
      • PRF: 난수, Password: 패스워드, Salt: 암호학 솔트, c: 원하는 반복 수, DLen: 원하는 다이제스트 길이
    • bcrypt: 패스워드 저장을 목적으로 설계됨. OpenBSD에서 기본적인 암호 메커니즘으로 사용됨.
      • bcrypt에서 "work factor"인자는 하나의 해시 다이제스트를 생성하는데 얼마만큼의 처리과정을 수행할지 결정한다. "work factor"를 조정하는 것만으로 보안을 높일수도 있다.
      • String hashed = BCrypt.hashpw(password, BCrypt.gensalt(11)); // gensalt is work factor
      • PBKDF2나 scrypt와는 달리 입력값으로 72 bytes character를 사용해야 한다.
    • scrypt: 다이제스트 생성할 때 메모리 오버헤드를 갖도록 설계되어, brute-force attack(모든경우의 수 대입)을 시도할 때 병렬화 처리가 매우 어렵다. PBKDF2보다 안전하다고 평가되며 bcrypt보다 경쟁력이 있다고 여겨진다.
      • DIGEST = scrypt(Password, Salt, N, r, p, DLen)
      • Password: 패스워드, Salt: 암호학 솔트, N: CPU 비용, r: 메모리 비용, p: 병렬화(parallelization), DLen: 원하는 다이제스트 길이

 

'보안' 카테고리의 다른 글

CSRF  (0) 2019.09.25