GO, bcrypt 비밀번호

bcrypt 패키지를 이용한 비밀번호 보호 방법

by 샨 LIP n BIP

웹 서비스를 이용할 때, 비밀번호를 등록해서 로그인 인증을 하는 경우가 많다.

우리가 입력한 비밀번호가 그대로 데이터베이스에 저장된다면 어떤 일이 일어날까?

데이터베이스의 단편적인 정보 유출로 유저 권한을 탈취당한다.

이런 일을 방지하기 위해서 로그인 비밀번호 등의 민감 정보는 암호화하는 과정이 필요하다.


# HASH

해쉬는 원본 데이터를 해쉬 함수를 이용해 변환한 결과값을 말한다.

해쉬는 단방향성 암호화 기능이기 때문에, 변환된 해쉬 데이터로부터 원본을 얻을 수 없다.

아래는 문자열에 SHA256 알고리즘을 이용해 해쉬로 변환하는 과정이다.


원본 데이터 = "샨 LIP n BIP"

----해쉬 함수 적용--->

변환 데이터 = "12f497ac02bbe138b507ff746d7024b79e33e4614e2cab908f371c85fe10b2d3"



# HASH ALGORITHM

해쉬 알고리즘은 상황에 맞는 여러 선택지가 있다.

정보의 중요성이나 변환 속도를 고려해 적절한 알고리즘을 선택해야한다.

많은 서비스에서 이용하는 해쉬 알고리즘은 SHA-256이다.

MD5

128비트 해시 값을 생성한다.

과거에 널리 사용되었으나, 현재는 심각한 보안 취약점 (충돌 공격에 취약)이 발견되어 보안 용도로는 사용하지 않는 것이 좋다.

파일 무결성 검사 등 간단한 용도로는 여전히 사용될 수 있다.

SHA-256

256비트 해시 값을 생성하며, 현재 가장 널리 사용되는 안전한 해시 알고리즘 중 하나다.

블록체인 기술(예: 비트코인)에서 주로 사용한다.

RIPEMD-160

RIPEMD-160은 160비트 해시 값을 생성하며, SHA-1과 유사한 보안 수준을 제공하는 것으로 알려져 있다.

Whirlpool

512비트 해시 값을 생성하며, 강력한 보안성을 목표로 한다.


# bcrypt package

GO에서 이용할 수 있는 패키지 중, 해쉬 함수를 지원하는 것이 있다.

bcrypt 패키지는 비밀번호 암호화를 중점으로 둔 패키지로, 주요한 3가지 함수가 노출되어 있다.

https://pkg.go.dev/golang.org/x/crypto@v0.37.0/bcrypt

GenerateFromPassword

주어진 비밀번호 문자열을 원본으로 이용해 해쉬 데이터를 반환한다.

CompareHashAndPassword

저장된 해쉬 데이터와 비밀번호 문자열에서 얻은 해쉬 데이터를 비교해 비밀번호를 비교한다.

Cost

해쉬 데이터를 만들기 위해 사용된 Cost를 반환한다.

GenerateFromPassword 함수에는 Cost라는 인자가 전달되어야 한다.(4부터 31)

Cost가 클수록 더 긴 해쉬가 생성되어 보안이 강화되는 대신, 컴퓨팅 비용이 증가한다.(Cost 값 만큼 해쉬 알고리즘이 반복되기 때문)


bcrypt가 유용한 이유는, 해쉬 데이터로 변환하기 전 원본 데이터에 salt라고 부르는 문자열을 삽입하는 기능과 Cost를 이용한 반복 해싱 때문이다.

salt가 삽입되면, 해쉬 데이터가 완전히 달라지기 때문에 무차별 대입으로부터 보안을 강화할 수 있다.

keyword
토요일 연재
이전 06화GO, Fiber POST Method