bcrypt를 이용하여 비밀번호 암호화하기

3130 단어 파이썬파이썬
def hash_password(account_password):
    if account_password:
        return bcrypt.hashpw(account_password.encode('utf-8'), bcrypt.gensalt())

encryption_password = hash_password(account_password)

위의 코드는 bcrypt를 이용하여 사용자에게 받은 비밀번호를 암호화하는 코드입니다. hash_password라는 함수를 이용하여 사용자에게 받은 비밀번호 값을 인자로 넣어 실행하면 암호화된 비밀번호를 반환해 줍니다. 그 비밀번호를 encryption_password로 선언하여 데이터 베이스에 저장 직전의 모습입니다.

비밀번호 암호화에 대한 코드를 사용할 때 적용하면 좋을 것 같습니다.

암호화가 되는 부분은 3번째 줄 return이 있는 줄입니다.여기서 해당 코드가 뜻하는 바를 좀 더 알 고 싶으면, 아래 글을 읽으시면 됩니다. 해당 부분의 코드를 하나하나 어떤 뜻을 가지고 있는지 같이 확인하면서 암호화에 대해서 알아보도록 하겠습니다.


bcrypt

bcrypt.hashpw(account_password.encode('utf-8'), bcrypt.gensalt())

bcrypt는 python에서 login, signup 기능을 구현할 때 자주 사용되는 단방향 algorithm 암호화 library 중 하나입니다.

단방향 algorithm 암호화

암호화 algorithm에는 양방향 암호화 기법과 단방향 암호화 기법이 있습니다.

양방향 암호화 기법은 간단하게 입력된 값을 암호화된 값으로 변경하고, 또한 암호화된 값을 다시 평문으로 변경이 가능합니다. 즉 암호화를 풀 수 있습니다.

단방향 암호화는 이러한 양방향 암호화 기법과 달리 평문을 암호화된 값으로 변경은 가능하지만, 암호화된 값을 평문으로 복호화 하는 것이 불가능 합니다.

그래서 비밀번호를 암호화 할 경우, 양방향 보다는 bcrypt의 단방향 algorithm이 주로 사용하며, bcrypt은 Hash기법을 사용하고 있습니다.


hashpw

bcrypt.hashpw (account_password.encode('utf-8'), bcrypt.gensalt())

hashpw는 bcrypt에서 제공되는 비밀번호를 Hashing하는 함수입니다. hash함수는 간단하게 평문을 알 수 없는 암호화를 변환해주는 함수라고 생각하면 됩니다.

  • 첫번째 인자

bcrypt.hashpw (account_password.encode('utf-8'), bcrypt.gensalt())

hashpw 함수의 첫번째 인자는 사용자가 입력한 평문의 password입니다. 하지만 hash 함수는 평문 string이 아닌 bytes string type만 인자로 받아 주기 때문에 위처럼 encode('utf-8') 함수를 통해서 bytes type으로 변환하여 인자로 넣었습니다.

파이썬에서는 string을 encode하면 bytes(이진화) 되고, bytes를 decode하면 string화 합니다.

  • 두번째 인자

bcrypt.hashpw(account_password.encode('utf-8'),bcrypt.gensalt())

두번째 인자로 bcypt.gensalt()을 넣으면, 기존의 비밀번호 값과 솔트에서 만든 임의의 값이 섞여지게 됩니다.


이렇게 비밀번호를 쉽게 해석할 수 없는 상태로 암호화한 뒤에 데이터베이스에 저장을 합니다. 이러한 방식은 회원가입을 할 때 자주 사용되는 로직입니다.

또한, 로그인을 할 때에도 비슷한 방식으로 사용자가 입력한 비밀번호를 암호화한 뒤 데이터베이스에 기존에 암호화 된 비밀번호를 가져와 서로 비교해서 맞는 다면 로그인을 시켜주는 로직을 구성하면 될 것 같습니다.

Salt (cryptography)

좋은 웹페이지 즐겨찾기