argon2 vs bcrypt
언젠가 당연하게 bcrypt 를 이용해 비밀번호를 해싱했다.
과연 bcrypt 가 최선이 맞을까?
암호화
암호화는 평문을 암호문으로 바꾸는 과정이다.
암호화는 가장 기본적인 정보보안 방법으로 그 자체로 데이터의 유출 등을 막지는 못하지만 데이터에 담긴 정보를 알 수 없게 하는 것이 목적이다.
bcrypt 가 무엇인가
단방향 암호화를 위해 만들어진 해시 함수
bcrypt 는 sha256 같은 해시 함수들의 문제점을 해결하기위해 설계되었다.
sha256 는 원래 암호화를 위해 설계된 것이 아니라 짧은 시간 데이터를 검색하기 위한 자료구조로 설계가 되었다.
이 때문에 빠른 속도가 장점이지만 취약점의 원인이 되기도 한다.
그래서 미리 해시값들을 계산해놓은 테이블을 가지고 해시 함수 반환값을 역추적하는 레인보우 테이블 공격에 취약하다.
이를 보완한 것이 bcrypt 같은 해시 함수이다.
bcrypt 에는 두가지 특징이 있다.
1. salting
실제 정보 이외에 추가적으로 무작위 데이터를 더해서 해시 값을 계산한다.
salt 로 인해 해시값이 달라지기 때문에, 레인보우 테이블 공격을 무효화 시킬 수 있다.
salt 는 해시 값을 바꾸는데 목적이 있다. salt 는 비밀번호 마다 모두 다르기 때문에 같은 비밀번호라도 해시값이 달라지게 된다.
2. 키 스트레칭
기존 단방향 해시 알고리즘의 빠른 실행 속도가 취약점이 되었던 것을 보완하기 위한 방법이다.
단방향 해시값을 계산한 후 그 해시값을 다시 해시하고, 이를 반복한다.
bcrypt 는 salting 과 키 스트레칭을 구현한 해시함수중 대표적인 함수라고 할 수 있다.
argon2 는 무엇일까
argon2 도 마찬가지로 해싱 알고리즘을 가지고 있다.
큰 특징으로는 해시하는데 걸리는 시간과 필요한 메모리 양을 결정할 수 있다.
하지만 argon2 는 bcrypt 보다 훨씬 더 나은 해싱 알고리즘을 제공한다.
여러 CPU 코어를 사용해서 해싱을 병렬로 처리할 수 있는 기능을 가지고 있다.
때문에 대규모 병렬 처리 공격에 강하다.(GPU, ASIC)
argon2 vs bcrypt
이 둘은 같은 목적을 가지고 있다.
비밀번호를 안전하게 저장하기 위해 고안된 것들이다.
하지만 bcrypt 는 GPU 를 사용한 공격에 취약하다. 그리고 CPU 작업량으로만 해싱 난이도를 조잘하는데
그에 반해 argon2 는 GPU 공격에 강하고, 시간과 메모리 사용량을 조절할 수 있다.
GPU 가 뭐야?
GPU 는 그래픽을 처리하기 위한 목적이다.
그래서 많은 코어를 가지고 있는데 이 때문에 병렬 데이터 처리에 엄청난 효율을 보인다.
때문에 병렬 처리가 가능한 작업을 빠르게 수행할 수 있다.
대량의 비밀번호 조합을 빠르게 생성하고 해싱해서 비밀번호를 추측하는 것, 브루트 포스와 사전 공격과 비슷하다.
짧은 시간안에 계산이 가능하기 때문에 bcrypt 는 취약하다.
argon2 가 왜 GPU 에 대한 저항을 가지고 있을까?
메모리 집약적으로 작업을 수행하는 해싱이 GPU 에 강하다.
즉 알고리즘이 실행 될 때 많은 양의 메모리를 사용하도록 요구하는 것이다.
마무리
bcrypt 는 현재 많이 사용되고 있다. 그만큼 많은 자료와 레퍼런스가 존재한다.
코인붐으로 인해 고사양의 그래픽카드들이 늘어났고, 해커도 이를 사용해 공격을 한다.
argon2 는 현재 많이 사용되고 있지는 않다. 때문에 많은 자료가 있지 않다.
하지만 직접 메모리, 시간을 조절할 수 있는 장점, GPU 공격에 강한 내성 등 충분히 사용을 고려해 볼 만 하다고 생각이 된다.