Skip to content
On this page

해싱(Hashing)

수정하기
문서 생성 2021-04-23 21:19:23 최근 수정 2022-11-18 23:50:15

해싱의 필요성

  • 개인정보보호법
    • 시스템이 인터넷에서 격리된 네트워크에 위치하는 경우나, 예외적인 개인정보 항목을 다루는 경우를 제외하고 국가에서 권고하는 상용 암호화 알고리즘을 이용해 개인정보를 암호화하도록 법적으로 요구하고 있다.
  • 외부 해킹 뿐 아니라, 내부 DB 관리자의 개인정보 악용을 방지하기 위해 암호화가 필요하다.
  • DB 저장시
    • 개인정보를 해싱하여 복원할 수 없도록 함
  • 통신시
    • 개인정보를 주고받을 때 SSL을 적용해 암호화
  • 예를 들어 "1234"를 그대로 DB에 저장하는 것이 아닌, 특정 해싱 알고리즘을 이용해 HASH("1234")를 계산, 저장하고 추후에 로그인 과정에서는 HASH("입력값")과 해시값을 비교해서 인증 로직을 수행한다.
  • 검증에 쓰이는 해시값을 Digest라고도 부른다.

단순 해싱하기

  • MD5나 SHA-1, SHA-256 (MD5, SHA-1은 모두 보안적 결함이 경고됨) 등의 해시 알고리즘
  • Raninbow Table, 해커들이 특정 길이의 문자열들에 대해 모든 해시값을 계산해두었다. 판매하는 사이트, Rainbow Table을 이용해 해시값을 유추해주는 사이트 또한 존재한다.

소금 간하기 (Salting)

  • 단순 해시값은 해킹에 쉽게 노출될 수 있다.
  • 비밀번호와 임의로 생성한 문자열(Salt)를 합쳐서 해싱하여 해시값을 저장하는 방법
  • 해시값과 소금을 같이 보관해야 한다.

해싱 반복하기 (Key Stretching)

  • 해시 과정을 여러번 반복하면 훨씬 많은 계산량이 필요해지므로 보안 수준을 높일 수 있다.
  • 하지만 정상적인 유저의 로그인 요청에 대한 응답 시간 또한 늦춰질 수 있음

안전성이 검증된 해싱 라이브러리

  • bcrypt는 Digest 자체에 소금값과 해시값 및 반복 횟수를 같이 보관하기 때문에, 비밀번호 해싱 을 적용하는데 있어서 DB 설계를 복잡하게 할 필요가 없다.

해싱 알고리즘

Password Hashing: Scrypt, Bcrypt and ARGON2

  • 이 글의 저자는 argon2를 사용할 것을 추천하고 있다.
  • 글의 내용을 다 이해하진 못했지만 공격자 입장에서 해싱된 암호를 풀기 위해 GPU, FPGA, ASIC로 연산을 하는 듯 하다.
    • Scrypt는 Bcrypt에 비해 memory hardness와 관련해 디자인이 더 좋다고 한다.
    • 계산할 때 필요한 메모리가 적으면 GPU와 ASIC로 병렬 계산을 해서 쉽게 암호를 풀 수 있기 때문에 메모리를 많이 쓰게 만드는 것
    • argon2는 PHC(Password Hashing Competition)에서 우승했다고 한다.