프로젝트를 하면서 회원가입이나 로그인을 위해 암호화가 필요했습니다. 그럴 때 사용되었던 Bcrypt
가 정확히 어떤 것인지, 그리고 어떤 장단점을 가지고있는지 알아보겠습니다.
Bcrypt
는 Niels Provos
와 David Mazières
가 만든 단방향 해싱 함수입니다. 사용자의 암호를 저장할 때 Text 그대로 DB
에 저장하면 범죄나 마찬가지라고 한다. 그러면 우리는 저장할 때 Text를 변환해줘야합니다. 여기서 변환하는 것을 Hashing
한다고 합니다. 즉, Bcrypt
는 원본 Text를 수학 식을 이용해서 변환해줍니다. 그렇게 변환된 결과는 Digest
라고 합니다.
단방향 해시 함수는 원본 Text를 알면 암호화된 결과를 알기 쉽지만, Digest를 통해 원본을 얻을 수 없습니다. 이 특정이 단방향
해시 함수로 만들어 줍니다. 그렇지만 동일한 Text가 항상 동일한 Digest를 만든다면, 공격자가 Digest 목록을 탈취해서 미리 확보한 Digest 목록과 비교해서 원본 Text를 역추적할 수 있습니다. 이러한 공격 기법을 Rainbow attack
이라고 합니다.
또한 단방향 해시 함수는 속도가 빠르다는 장점이 있지만 이 장점으로 인해 해커는 매우 빠른 속도로 임의의 문자열로 비교할 수 있다. 그래서 오히려 사용자보다 공격자에게 더 편의성을 제공한다고 한다.
그렇지만 단방향 해시 함수를 보완하면 좋은 암호화 기법이 될 수 있습니다.
Salt
는 Digest
를 생성할 때 추가되는 바이트 단위의 무작위 문자열입니다. 그리고 이런 Salt
를 원본에 붙여서 해싱하는 것을 Salting
라고 합니다. 아래의 그림을 보면 쉽게 이해할 수 있습니다.
Salt
와 Digest
는 둘이 함께 DB
에 저장됩니다. 또한 Salt
가 32 바이트 이상 길어야 공격자가 추적하기 힘들다고 합니다. 첨언을 하면 이렇게 Salt
가 추가되면 큰 리스트의 비밀번호를 추적하는데 어려워진답니다. 그러므로 Ranbow table
가 무력화 된다고 합니다.