해싱(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)에서 우승했다고 한다.